1 use {io, poll, Evented, Ready, Poll, PollOpt, Token};
2 use zircon_sys::zx_handle_t;
3 use std::sync::Mutex;
4 
5 /// Wrapper for registering a `HandleBase` type with mio.
6 #[derive(Debug)]
7 pub struct EventedHandle {
8     /// The handle to be registered.
9     handle: zx_handle_t,
10 
11     /// The current `Token` with which the handle is registered with mio.
12     token: Mutex<Option<Token>>,
13 }
14 
15 impl EventedHandle {
16     /// Create a new `EventedHandle` which can be registered with mio
17     /// in order to receive event notifications.
18     ///
19     /// The underlying handle must not be dropped while the
20     /// `EventedHandle` still exists.
new(handle: zx_handle_t) -> Self21     pub unsafe fn new(handle: zx_handle_t) -> Self {
22         EventedHandle {
23             handle: handle,
24             token: Mutex::new(None),
25         }
26     }
27 
28     /// Get the underlying handle being registered.
get_handle(&self) -> zx_handle_t29     pub fn get_handle(&self) -> zx_handle_t {
30         self.handle
31     }
32 }
33 
34 impl Evented for EventedHandle {
register(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()>35     fn register(&self,
36                 poll: &Poll,
37                 token: Token,
38                 interest: Ready,
39                 opts: PollOpt) -> io::Result<()>
40     {
41         let mut this_token = self.token.lock().unwrap();
42         {
43             poll::selector(poll).register_handle(self.handle, token, interest, opts)?;
44             *this_token = Some(token);
45         }
46         Ok(())
47     }
48 
reregister(&self, poll: &Poll, token: Token, interest: Ready, opts: PollOpt) -> io::Result<()>49     fn reregister(&self,
50         poll: &Poll,
51         token: Token,
52         interest: Ready,
53         opts: PollOpt) -> io::Result<()>
54     {
55         let mut this_token = self.token.lock().unwrap();
56         {
57             poll::selector(poll).deregister_handle(self.handle, token)?;
58             *this_token = None;
59             poll::selector(poll).register_handle(self.handle, token, interest, opts)?;
60             *this_token = Some(token);
61         }
62         Ok(())
63     }
64 
deregister(&self, poll: &Poll) -> io::Result<()>65     fn deregister(&self, poll: &Poll) -> io::Result<()> {
66         let mut this_token = self.token.lock().unwrap();
67         let token = if let Some(token) = *this_token { token } else {
68             return Err(io::Error::new(
69                 io::ErrorKind::NotFound,
70                 "Attempted to deregister an unregistered handle."))
71         };
72         {
73             poll::selector(poll).deregister_handle(self.handle, token)?;
74             *this_token = None;
75         }
76         Ok(())
77     }
78 }
79