redox/programs/timeout/src/main.rs
2017-04-08 22:02:38 -06:00

45 lines
1.4 KiB
Rust

extern crate event;
extern crate syscall;
use event::EventQueue;
use std::fs::File;
use std::io::{Result, Read, Write};
use std::mem;
use std::os::unix::io::AsRawFd;
use syscall::data::TimeSpec;
use syscall::flag::CLOCK_MONOTONIC;
fn main() {
let mut event_queue = EventQueue::<TimeSpec>::new().expect("timeout: failed to create event queue");
let path = format!("time:{}", CLOCK_MONOTONIC);
let mut file = File::open(&path).expect(&format!("timeout: failed to open {}", path));
let mut timeout = TimeSpec::default();
file.read(&mut timeout).unwrap();
println!("Current: {:?}", timeout);
timeout.tv_sec += 1;
println!("Setting timeout: {:?}", timeout);
file.write(&timeout).unwrap();
event_queue.add(file.as_raw_fd(), move |_count: usize| -> Result<Option<TimeSpec>> {
let mut time = TimeSpec::default();
if file.read(&mut time)? >= mem::size_of::<TimeSpec>() {
if time.tv_sec > timeout.tv_sec
|| (time.tv_sec == timeout.tv_sec && time.tv_nsec >= timeout.tv_nsec )
{
return Ok(Some(time))
}
}
Ok(None)
}).expect("timeout: failed to poll time");
event_queue.trigger_all(0).expect("timeout: failed to trigger events");
let time = event_queue.run().expect("timeout: failed to run event loop");
println!("Time passed: {:?}", time);
}