From c4d652b1dea6d17e156925838c5fe47f00f085f0 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sat, 8 Apr 2017 22:02:38 -0600 Subject: [PATCH] Add timeout example --- Cargo.toml | 1 + mk/userspace/mod.mk | 3 ++- programs/timeout/Cargo.toml | 8 +++++++ programs/timeout/src/main.rs | 44 ++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 programs/timeout/Cargo.toml create mode 100644 programs/timeout/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index 5888ed1..00c3732 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,7 @@ members = [ "programs/pkgutils", "programs/smith", "programs/tar", + "programs/timeout", "programs/userutils", "schemes/ethernetd", "schemes/ipd", diff --git a/mk/userspace/mod.mk b/mk/userspace/mod.mk index 80b6612..0a12655 100644 --- a/mk/userspace/mod.mk +++ b/mk/userspace/mod.mk @@ -12,7 +12,8 @@ userspace: \ filesystem/bin/acid \ filesystem/bin/contain \ filesystem/bin/smith \ - filesystem/bin/tar + filesystem/bin/tar \ + filesystem/bin/timeout include mk/userspace/coreutils.mk include mk/userspace/drivers.mk diff --git a/programs/timeout/Cargo.toml b/programs/timeout/Cargo.toml new file mode 100644 index 0000000..9ca5a42 --- /dev/null +++ b/programs/timeout/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "timeout" +version = "0.1.0" +authors = ["Jeremy Soller "] + +[dependencies] +redox_event = { git = "https://github.com/redox-os/event.git" } +redox_syscall = "0.1" diff --git a/programs/timeout/src/main.rs b/programs/timeout/src/main.rs new file mode 100644 index 0000000..baa7692 --- /dev/null +++ b/programs/timeout/src/main.rs @@ -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::::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> { + let mut time = TimeSpec::default(); + if file.read(&mut time)? >= mem::size_of::() { + 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); +}