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 | |