| use {io, poll, Evented, Ready, Poll, PollOpt, Token}; |
| use magenta_sys::mx_handle_t; |
| use std::sync::Mutex; |
| |
| /// Wrapper for registering a `HandleBase` type with mio. |
| #[derive(Debug)] |
| pub struct EventedHandle { |
| /// The handle to be registered. |
| handle: mx_handle_t, |
| |
| /// The current `Token` with which the handle is registered with mio. |
| token: Mutex<Option<Token>>, |
| } |
| |
| impl EventedHandle { |
| /// Create a new `EventedHandle` which can be registered with mio |
| /// in order to receive event notifications. |
| /// |
| /// The underlying handle must not be dropped while the |
| /// `EventedHandle` still exists. |
| pub unsafe fn new(handle: mx_handle_t) -> Self { |
| EventedHandle { |
| handle: handle, |
| token: Mutex::new(None), |
| } |
| } |
| |
| /// Get the underlying handle being registered. |
| pub fn get_handle(&self) -> mx_handle_t { |
| self.handle |
| } |
| } |
| |
| impl Evented for EventedHandle { |
| fn register(&self, |
| poll: &Poll, |
| token: Token, |
| interest: Ready, |
| opts: PollOpt) -> io::Result<()> |
| { |
| let mut this_token = self.token.lock().unwrap(); |
| { |
| poll::selector(poll).register_handle(self.handle, token, interest, opts)?; |
| *this_token = Some(token); |
| } |
| Ok(()) |
| } |
| |
| fn reregister(&self, |
| poll: &Poll, |
| token: Token, |
| interest: Ready, |
| opts: PollOpt) -> io::Result<()> |
| { |
| let mut this_token = self.token.lock().unwrap(); |
| { |
| poll::selector(poll).deregister_handle(self.handle, token)?; |
| *this_token = None; |
| poll::selector(poll).register_handle(self.handle, token, interest, opts)?; |
| *this_token = Some(token); |
| } |
| Ok(()) |
| } |
| |
| fn deregister(&self, poll: &Poll) -> io::Result<()> { |
| let mut this_token = self.token.lock().unwrap(); |
| let token = if let Some(token) = *this_token { token } else { |
| return Err(io::Error::new( |
| io::ErrorKind::NotFound, |
| "Attempted to deregister an unregistered handle.")) |
| }; |
| { |
| poll::selector(poll).deregister_handle(self.handle, token)?; |
| *this_token = None; |
| } |
| Ok(()) |
| } |
| } |