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
#[macro_export]
macro_rules! timeout {
    ($t:expr, $f:expr) => {{
        let mut result = Err($crate::Error::Timeout);
        while $t.running() {
            match $f {
                Ok(ok) => {
                    result = Ok(ok);
                    break;
                },
                Err(err) => match err {
                    $crate::Error::WouldBlock => (),
                    _ => {
                        result = Err(err);
                        break;
                    }
                },
            }
        }
        result
    }};
}

pub trait Timeout {
    fn reset(&mut self);
    fn running(&self) -> bool;
}