macro_rules! windows_syscall {
(BOOL, $e:expr) => {{
#[allow(unused_unsafe)]
let res = unsafe { $e };
if res == 0 {
Err(std::io::Error::last_os_error())
} else {
Ok(0u32)
}
}};
(BOOLEAN, $e:expr) => {{
#[allow(unused_unsafe)]
let res = unsafe { $e };
if !res {
Err(std::io::Error::last_os_error())
} else {
Ok(0u32)
}
}};
(SOCKET, $e:expr) => {{
#[allow(unused_unsafe)]
let res = unsafe { $e };
if res != 0 {
Err(std::io::Error::from_raw_os_error(unsafe {
windows_sys::Win32::Networking::WinSock::WSAGetLastError()
}))
} else {
Ok(0u32)
}
}};
}
macro_rules! windows_syscall_blocking {
(value $block:block) => {{
$crate::driver::backends::iocp::IocpSubmission::Blocking($crate::driver::ops::BlockingJob::new(move || {
$crate::driver::ops::Completion::from_blocking_result({ $block })
}))
}};
($block:block) => {{
$crate::driver::backends::iocp::IocpSubmission::Blocking($crate::driver::ops::BlockingJob::new(move || match {
$block
} {
Ok(val) => $crate::driver::ops::Completion::new(Ok(val)),
Err(err) => $crate::driver::ops::Completion::new(Err(err)),
}))
}};
}
macro_rules! windows_syscall_submit_overlapped {
($interest:expr, file, $call:expr) => {{
#[allow(unused_unsafe)]
let result = unsafe { $call };
if result != 0 {
return $crate::driver::backends::iocp::IocpSubmission::Pending($interest);
}
let err = std::io::Error::last_os_error();
if err.raw_os_error() == Some(windows_sys::Win32::Foundation::ERROR_IO_PENDING as i32) {
return $crate::driver::backends::iocp::IocpSubmission::Pending($interest);
}
$crate::driver::backends::iocp::IocpSubmission::Ready($crate::driver::ops::Completion::new(Err(err)))
}};
($interest:expr, socket, $call:expr) => {{
#[allow(unused_unsafe)]
let result = unsafe { $call };
if result == 0 {
return $crate::driver::backends::iocp::IocpSubmission::Pending($interest);
}
let err = unsafe { windows_sys::Win32::Networking::WinSock::WSAGetLastError() };
if err == windows_sys::Win32::Networking::WinSock::WSA_IO_PENDING {
return $crate::driver::backends::iocp::IocpSubmission::Pending($interest);
}
$crate::driver::backends::iocp::IocpSubmission::Ready($crate::driver::ops::Completion::new(Err(
std::io::Error::from_raw_os_error(err),
)))
}};
($interest:expr, winsock, $call:expr) => {{
#[allow(unused_unsafe)]
let result = unsafe { $call };
if result != 0 {
return $crate::driver::backends::iocp::IocpSubmission::Pending($interest);
}
let err = unsafe { windows_sys::Win32::Networking::WinSock::WSAGetLastError() };
if err == windows_sys::Win32::Networking::WinSock::WSA_IO_PENDING {
return $crate::driver::backends::iocp::IocpSubmission::Pending($interest);
}
$crate::driver::backends::iocp::IocpSubmission::Ready($crate::driver::ops::Completion::new(Err(
std::io::Error::from_raw_os_error(err),
)))
}};
}