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