Add timeout example

This commit is contained in:
Jeremy Soller 2017-04-08 22:02:38 -06:00
parent 9970349f7a
commit c4d652b1de
4 changed files with 55 additions and 1 deletions

View file

@ -24,6 +24,7 @@ members = [
"programs/pkgutils", "programs/pkgutils",
"programs/smith", "programs/smith",
"programs/tar", "programs/tar",
"programs/timeout",
"programs/userutils", "programs/userutils",
"schemes/ethernetd", "schemes/ethernetd",
"schemes/ipd", "schemes/ipd",

View file

@ -12,7 +12,8 @@ userspace: \
filesystem/bin/acid \ filesystem/bin/acid \
filesystem/bin/contain \ filesystem/bin/contain \
filesystem/bin/smith \ filesystem/bin/smith \
filesystem/bin/tar filesystem/bin/tar \
filesystem/bin/timeout
include mk/userspace/coreutils.mk include mk/userspace/coreutils.mk
include mk/userspace/drivers.mk include mk/userspace/drivers.mk

View file

@ -0,0 +1,8 @@
[package]
name = "timeout"
version = "0.1.0"
authors = ["Jeremy Soller <jackpot51@gmail.com>"]
[dependencies]
redox_event = { git = "https://github.com/redox-os/event.git" }
redox_syscall = "0.1"

View file

@ -0,0 +1,44 @@
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);
}