1 /// Helper macro to execute a system call that returns an `io::Result`.
2 //
3 // Macro must be defined before any modules that uses them.
4 #[allow(unused_macros)]
5 macro_rules! syscall {
6     ($fn: ident ( $($arg: expr),* $(,)* ) ) => {{
7         #[allow(unused_unsafe)]
8         let res = unsafe { libc::$fn($($arg, )*) };
9         if res < 0 {
10             Err(std::io::Error::last_os_error())
11         } else {
12             Ok(res)
13         }
14     }};
15 }
16 
17 cfg_os_poll! {
18     #[cfg_attr(all(
19         not(mio_unsupported_force_poll_poll),
20         any(
21             target_os = "android",
22             target_os = "illumos",
23             target_os = "linux",
24             target_os = "redox",
25         )
26     ), path = "selector/epoll.rs")]
27     #[cfg_attr(all(
28         not(mio_unsupported_force_poll_poll),
29         any(
30             target_os = "dragonfly",
31             target_os = "freebsd",
32             target_os = "ios",
33             target_os = "macos",
34             target_os = "netbsd",
35             target_os = "openbsd",
36             target_os = "tvos",
37             target_os = "visionos",
38             target_os = "watchos",
39         )
40     ), path = "selector/kqueue.rs")]
41     #[cfg_attr(any(
42         mio_unsupported_force_poll_poll,
43         target_os = "aix",
44         target_os = "espidf",
45         target_os = "fuchsia",
46         target_os = "haiku",
47         target_os = "hermit",
48         target_os = "hurd",
49         target_os = "nto",
50         target_os = "solaris",
51         target_os = "vita",
52     ), path = "selector/poll.rs")]
53     mod selector;
54     pub(crate) use self::selector::*;
55 
56     #[cfg_attr(all(
57         not(mio_unsupported_force_waker_pipe),
58         any(
59             target_os = "android",
60             target_os = "espidf",
61             target_os = "fuchsia",
62             target_os = "hermit",
63             target_os = "illumos",
64             target_os = "linux",
65         )
66     ), path = "waker/eventfd.rs")]
67     #[cfg_attr(all(
68         not(mio_unsupported_force_waker_pipe),
69         not(mio_unsupported_force_poll_poll), // `kqueue(2)` based waker doesn't work with `poll(2)`.
70         any(
71             target_os = "freebsd",
72             target_os = "ios",
73             target_os = "macos",
74             target_os = "tvos",
75             target_os = "visionos",
76             target_os = "watchos",
77         )
78     ), path = "waker/kqueue.rs")]
79     #[cfg_attr(any(
80         // NOTE: also add to the list list for the `pipe` module below.
81         mio_unsupported_force_waker_pipe,
82         all(
83             // `kqueue(2)` based waker doesn't work with `poll(2)`.
84             mio_unsupported_force_poll_poll,
85             any(
86                 target_os = "freebsd",
87                 target_os = "ios",
88                 target_os = "macos",
89                 target_os = "tvos",
90                 target_os = "visionos",
91                 target_os = "watchos",
92             ),
93         ),
94         target_os = "aix",
95         target_os = "dragonfly",
96         target_os = "haiku",
97         target_os = "hurd",
98         target_os = "netbsd",
99         target_os = "nto",
100         target_os = "openbsd",
101         target_os = "redox",
102         target_os = "solaris",
103         target_os = "vita",
104     ), path = "waker/pipe.rs")]
105     mod waker;
106     // NOTE: the `Waker` type is expected in the selector module as the
107     // `poll(2)` implementation needs to do some special stuff.
108 
109     mod sourcefd;
110     #[cfg(feature = "os-ext")]
111     pub use self::sourcefd::SourceFd;
112 
113     cfg_net! {
114         mod net;
115 
116         pub(crate) mod tcp;
117         pub(crate) mod udp;
118         #[cfg(not(target_os = "hermit"))]
119         pub(crate) mod uds;
120     }
121 
122     #[cfg(all(
123         any(
124             // For the public `pipe` module, must match `cfg_os_ext` macro.
125             feature = "os-ext",
126             // For the `Waker` type based on a pipe.
127             mio_unsupported_force_waker_pipe,
128             all(
129                 // `kqueue(2)` based waker doesn't work with `poll(2)`.
130                 mio_unsupported_force_poll_poll,
131                 any(
132                     target_os = "freebsd",
133                     target_os = "ios",
134                     target_os = "macos",
135                     target_os = "tvos",
136                     target_os = "visionos",
137                     target_os = "watchos",
138                 ),
139             ),
140             // NOTE: also add to the list list for the `pipe` module below.
141             target_os = "aix",
142             target_os = "dragonfly",
143             target_os = "haiku",
144             target_os = "hurd",
145             target_os = "netbsd",
146             target_os = "nto",
147             target_os = "openbsd",
148             target_os = "redox",
149             target_os = "solaris",
150             target_os = "vita",
151         ),
152         // Hermit doesn't support pipes.
153         not(target_os = "hermit"),
154     ))]
155     pub(crate) mod pipe;
156 }
157 
158 cfg_not_os_poll! {
159     cfg_any_os_ext! {
160         mod sourcefd;
161         #[cfg(feature = "os-ext")]
162         pub use self::sourcefd::SourceFd;
163     }
164 }
165