use {TryRead, TryWrite};
use io::{self, PipeReader, PipeWriter};
use std::mem;
use std::os::unix::io::{RawFd, AsRawFd};
pub struct Awakener {
reader: PipeReader,
writer: PipeWriter,
}
impl Awakener {
pub fn new() -> io::Result<Awakener> {
let (rd, wr) = try!(io::pipe());
Ok(Awakener {
reader: rd,
writer: wr
})
}
pub fn as_raw_fd(&self) -> RawFd {
self.reader.as_raw_fd()
}
pub fn wakeup(&self) -> io::Result<()> {
unsafe {
let wr: &mut PipeWriter = mem::transmute(&self.writer);
wr.write_slice(b"0x01").map(|_| ())
}
}
pub fn cleanup(&self) {
let mut buf = [0; 128];
loop {
unsafe {
let rd: &mut PipeReader = mem::transmute(&self.reader);
match rd.read_slice(&mut buf) {
Ok(Some(i)) if i > 0 => {},
_ => return,
}
}
}
}
}