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 | let res = unsafe { libc::$fn($($arg, )*) }; |
8 | if res == -1 { |
9 | Err(std::io::Error::last_os_error()) |
10 | } else { |
11 | Ok(res) |
12 | } |
13 | }}; |
14 | } |
15 | |
16 | cfg_os_poll! { |
17 | mod selector; |
18 | pub(crate) use self::selector::{event, Event, Events, Selector}; |
19 | |
20 | mod sourcefd; |
21 | pub use self::sourcefd::SourceFd; |
22 | |
23 | mod waker; |
24 | pub(crate) use self::waker::Waker; |
25 | |
26 | cfg_net! { |
27 | mod net; |
28 | |
29 | pub(crate) mod tcp; |
30 | pub(crate) mod udp; |
31 | pub(crate) mod uds; |
32 | pub use self::uds::SocketAddr; |
33 | } |
34 | |
35 | cfg_io_source! { |
36 | use std::io; |
37 | |
38 | // Both `kqueue` and `epoll` don't need to hold any user space state. |
39 | pub(crate) struct IoSourceState; |
40 | |
41 | impl IoSourceState { |
42 | pub fn new() -> IoSourceState { |
43 | IoSourceState |
44 | } |
45 | |
46 | pub fn do_io<T, F, R>(&self, f: F, io: &T) -> io::Result<R> |
47 | where |
48 | F: FnOnce(&T) -> io::Result<R>, |
49 | { |
50 | // We don't hold state, so we can just call the function and |
51 | // return. |
52 | f(io) |
53 | } |
54 | } |
55 | } |
56 | |
57 | cfg_os_ext! { |
58 | pub(crate) mod pipe; |
59 | } |
60 | } |
61 | |
62 | cfg_not_os_poll! { |
63 | cfg_net! { |
64 | mod uds; |
65 | pub use self::uds::SocketAddr; |
66 | } |
67 | |
68 | cfg_any_os_ext! { |
69 | mod sourcefd; |
70 | pub use self::sourcefd::SourceFd; |
71 | } |
72 | } |
73 | |