pub use self::pipe::Awakener;
mod pipe {
use {io, Evented, EventSet, PollOpt, Selector, Token, TryRead, TryWrite};
use unix::{self, PipeReader, PipeWriter};
use std::mem;
use std::cell::UnsafeCell;
pub struct Awakener {
reader: UnsafeCell<PipeReader>,
writer: UnsafeCell<PipeWriter>,
}
impl Awakener {
pub fn new() -> io::Result<Awakener> {
let (rd, wr) = try!(unix::pipe());
Ok(Awakener {
reader: UnsafeCell::new(rd),
writer: UnsafeCell::new(wr),
})
}
pub fn wakeup(&self) -> io::Result<()> {
unsafe {
let wr: &mut PipeWriter = mem::transmute(self.writer.get());
wr.try_write(b"0x01").map(|_| ())
}
}
pub fn cleanup(&self) {
let mut buf = [0; 128];
loop {
unsafe {
let rd: &mut PipeReader = mem::transmute(self.reader.get());
match rd.try_read(&mut buf) {
Ok(Some(i)) if i > 0 => {},
_ => return,
}
}
}
}
fn reader(&self) -> &PipeReader {
unsafe { mem::transmute(self.reader.get()) }
}
}
impl Evented for Awakener {
fn register(&self, selector: &mut Selector, token: Token, interest: EventSet, opts: PollOpt) -> io::Result<()> {
self.reader().register(selector, token, interest, opts)
}
fn reregister(&self, selector: &mut Selector, token: Token, interest: EventSet, opts: PollOpt) -> io::Result<()> {
self.reader().reregister(selector, token, interest, opts)
}
fn deregister(&self, selector: &mut Selector) -> io::Result<()> {
self.reader().deregister(selector)
}
}
}