• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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