/// Helper macro to execute a system call that returns an `io::Result`. // // Macro must be defined before any modules that uses them. #[allow(unused_macros)] macro_rules! syscall { ($fn: ident ( $($arg: expr),* $(,)* ) ) => {{ #[allow(unused_unsafe)] let res = unsafe { libc::$fn($($arg, )*) }; if res < 0 { Err(std::io::Error::last_os_error()) } else { Ok(res) } }}; } cfg_os_poll! { #[cfg_attr(all( not(mio_unsupported_force_poll_poll), any( target_os = "android", target_os = "illumos", target_os = "linux", target_os = "redox", ) ), path = "selector/epoll.rs")] #[cfg_attr(all( not(mio_unsupported_force_poll_poll), any( target_os = "dragonfly", target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "netbsd", target_os = "openbsd", target_os = "tvos", target_os = "visionos", target_os = "watchos", ) ), path = "selector/kqueue.rs")] #[cfg_attr(any( mio_unsupported_force_poll_poll, target_os = "aix", target_os = "espidf", target_os = "fuchsia", target_os = "haiku", target_os = "hermit", target_os = "hurd", target_os = "nto", target_os = "solaris", target_os = "vita", ), path = "selector/poll.rs")] mod selector; pub(crate) use self::selector::*; #[cfg_attr(all( not(mio_unsupported_force_waker_pipe), any( target_os = "android", target_os = "espidf", target_os = "fuchsia", target_os = "hermit", target_os = "illumos", target_os = "linux", ) ), path = "waker/eventfd.rs")] #[cfg_attr(all( not(mio_unsupported_force_waker_pipe), not(mio_unsupported_force_poll_poll), // `kqueue(2)` based waker doesn't work with `poll(2)`. any( target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "tvos", target_os = "visionos", target_os = "watchos", ) ), path = "waker/kqueue.rs")] #[cfg_attr(any( // NOTE: also add to the list list for the `pipe` module below. mio_unsupported_force_waker_pipe, all( // `kqueue(2)` based waker doesn't work with `poll(2)`. mio_unsupported_force_poll_poll, any( target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "tvos", target_os = "visionos", target_os = "watchos", ), ), target_os = "aix", target_os = "dragonfly", target_os = "haiku", target_os = "hurd", target_os = "netbsd", target_os = "nto", target_os = "openbsd", target_os = "redox", target_os = "solaris", target_os = "vita", ), path = "waker/pipe.rs")] mod waker; // NOTE: the `Waker` type is expected in the selector module as the // `poll(2)` implementation needs to do some special stuff. mod sourcefd; #[cfg(feature = "os-ext")] pub use self::sourcefd::SourceFd; cfg_net! { mod net; pub(crate) mod tcp; pub(crate) mod udp; #[cfg(not(target_os = "hermit"))] pub(crate) mod uds; } #[cfg(all( any( // For the public `pipe` module, must match `cfg_os_ext` macro. feature = "os-ext", // For the `Waker` type based on a pipe. mio_unsupported_force_waker_pipe, all( // `kqueue(2)` based waker doesn't work with `poll(2)`. mio_unsupported_force_poll_poll, any( target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "tvos", target_os = "visionos", target_os = "watchos", ), ), // NOTE: also add to the list list for the `pipe` module below. target_os = "aix", target_os = "dragonfly", target_os = "haiku", target_os = "hurd", target_os = "netbsd", target_os = "nto", target_os = "openbsd", target_os = "redox", target_os = "solaris", target_os = "vita", ), // Hermit doesn't support pipes. not(target_os = "hermit"), ))] pub(crate) mod pipe; } cfg_not_os_poll! { cfg_any_os_ext! { mod sourcefd; #[cfg(feature = "os-ext")] pub use self::sourcefd::SourceFd; } }