     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72

    /// 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),* $(,)* ) ) => {{
            let res = unsafe { libc::$fn($($arg, )*) };
            if res == -1 {
                Err(std::io::Error::last_os_error())
            } else {
                Ok(res)
            }
        }};
    }

    cfg_os_poll! {
        mod selector;
        pub(crate) use self::selector::{event, Event, Events, Selector};

        mod sourcefd;
        pub use self::sourcefd::SourceFd;

        mod waker;
        pub(crate) use self::waker::Waker;

        cfg_net! {
            mod net;

            pub(crate) mod tcp;
            pub(crate) mod udp;
            pub(crate) mod uds;
            pub use self::uds::SocketAddr;
        }

        cfg_io_source! {
            use std::io;

            // Both `kqueue` and `epoll` don't need to hold any user space state.
            pub(crate) struct IoSourceState;

            impl IoSourceState {
                pub fn new() -> IoSourceState {
                    IoSourceState
                }

                pub fn do_io<T, F, R>(&self, f: F, io: &T) -> io::Result<R>
                where
                    F: FnOnce(&T) -> io::Result<R>,
                {
                    // We don't hold state, so we can just call the function and
                    // return.
                    f(io)
                }
            }
        }

        cfg_os_ext! {
            pub(crate) mod pipe;
        }
    }

    cfg_not_os_poll! {
        cfg_net! {
            mod uds;
            pub use self::uds::SocketAddr;
        }

        cfg_any_os_ext! {
            mod sourcefd;
            pub use self::sourcefd::SourceFd;
        }
    }