diff options
Diffstat (limited to 'vendor/rustix/src/backend/libc/event/windows_syscalls.rs')
| -rw-r--r-- | vendor/rustix/src/backend/libc/event/windows_syscalls.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/vendor/rustix/src/backend/libc/event/windows_syscalls.rs b/vendor/rustix/src/backend/libc/event/windows_syscalls.rs new file mode 100644 index 00000000..05394f55 --- /dev/null +++ b/vendor/rustix/src/backend/libc/event/windows_syscalls.rs @@ -0,0 +1,79 @@ +//! Windows system calls in the `event` module. + +use crate::backend::c; +use crate::backend::conv::ret_c_int; +use crate::event::{FdSetElement, PollFd, Timespec}; +use crate::io; + +pub(crate) fn poll(fds: &mut [PollFd<'_>], timeout: Option<&Timespec>) -> io::Result<usize> { + let nfds = fds + .len() + .try_into() + .map_err(|_convert_err| io::Errno::INVAL)?; + + let timeout = match timeout { + None => -1, + Some(timeout) => timeout.as_c_int_millis().ok_or(io::Errno::INVAL)?, + }; + + ret_c_int(unsafe { c::poll(fds.as_mut_ptr().cast(), nfds, timeout) }) + .map(|nready| nready as usize) +} + +pub(crate) fn select( + nfds: i32, + readfds: Option<&mut [FdSetElement]>, + writefds: Option<&mut [FdSetElement]>, + exceptfds: Option<&mut [FdSetElement]>, + timeout: Option<&crate::timespec::Timespec>, +) -> io::Result<i32> { + use core::ptr::{null, null_mut}; + + let readfds = match readfds { + Some(readfds) => { + assert!(readfds.len() >= readfds[0].0 as usize); + readfds.as_mut_ptr() + } + None => null_mut(), + }; + let writefds = match writefds { + Some(writefds) => { + assert!(writefds.len() >= writefds[0].0 as usize); + writefds.as_mut_ptr() + } + None => null_mut(), + }; + let exceptfds = match exceptfds { + Some(exceptfds) => { + assert!(exceptfds.len() >= exceptfds[0].0 as usize); + exceptfds.as_mut_ptr() + } + None => null_mut(), + }; + + let timeout_data; + let timeout_ptr = match timeout { + Some(timeout) => { + // Convert from `Timespec` to `TIMEVAL`. + timeout_data = c::TIMEVAL { + tv_sec: timeout + .tv_sec + .try_into() + .map_err(|_| io::Errno::OPNOTSUPP)?, + tv_usec: ((timeout.tv_nsec + 999) / 1000) as _, + }; + &timeout_data + } + None => null(), + }; + + unsafe { + ret_c_int(c::select( + nfds, + readfds.cast(), + writefds.cast(), + exceptfds.cast(), + timeout_ptr, + )) + } +} |
