Add timeout example
This commit is contained in:
parent
9970349f7a
commit
c4d652b1de
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
8
programs/timeout/Cargo.toml
Normal file
8
programs/timeout/Cargo.toml
Normal 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"
|
44
programs/timeout/src/main.rs
Normal file
44
programs/timeout/src/main.rs
Normal 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);
|
||||||
|
}
|
Loading…
Reference in a new issue