use crate::{io, poll, Evented, Poll, PollOpt, Ready, Token};
use std::sync::Mutex;
use zircon_sys::zx_handle_t;
#[derive(Debug)]
pub struct EventedHandle {
handle: zx_handle_t,
token: Mutex<Option<Token>>,
}
impl EventedHandle {
pub unsafe fn new(handle: zx_handle_t) -> Self {
EventedHandle {
handle: handle,
token: Mutex::new(None),
}
}
pub fn get_handle(&self) -> zx_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(())
}
}