blob: fc70c15c27dd6453c9efd33af18419b3635cb585 [file] [log] [blame]
use {io, poll, Evented, Ready, Poll, PollOpt, Token};
use magenta::HandleBase;
use std::sync::Mutex;
/// Wrapper for registering a `HandleBase` type with mio.
#[derive(Debug)]
pub struct EventedHandle<T> where T: HandleBase {
/// The handle to be registered.
handle: T,
/// The current `Token` with which the handle is registered with mio.
token: Mutex<Option<Token>>,
}
impl<T> EventedHandle<T> where T: HandleBase {
/// Create a new `EventedHandle` which can be registered with mio
/// in order to receive event notifications.
pub fn new(handle: T) -> Self {
EventedHandle {
handle: handle,
token: Mutex::new(None),
}
}
/// Get a reference to the underlying `HandleBase`.
pub fn get_ref(&self) -> &T {
&self.handle
}
/// Get a mutable reference to the underlying `HandleBase`.
pub fn get_mut(&mut self) -> &mut T {
&mut self.handle
}
/// Convert back into the inner `HandleBase`.
pub fn into_inner(self) -> T {
self.handle
}
}
impl<T> Evented for EventedHandle<T> where T: HandleBase {
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(())
}
}