From f75e1c480223d3a8fe428e5b05c9b55e2562331b Mon Sep 17 00:00:00 2001 From: Timothy DeHerrera <tim.deh@pm.me> Date: Tue, 8 Oct 2019 11:54:02 -0600 Subject: [PATCH] implement remaninder for nanosleep --- src/syscall/time.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/syscall/time.rs b/src/syscall/time.rs index 4bad432c..799482e5 100644 --- a/src/syscall/time.rs +++ b/src/syscall/time.rs @@ -21,7 +21,7 @@ pub fn nanosleep(req: &TimeSpec, rem_opt: Option<&mut TimeSpec>) -> Result<usize //start is a tuple of (seconds, nanoseconds) let start = time::monotonic(); let sum = start.1 + req.tv_nsec as u64; - let end = (start.0 + req.tv_sec as u64 + sum / 1_000_000_000, sum % 1_000_000_000); + let mut end = (start.0 + req.tv_sec as u64 + sum / 1_000_000_000, sum % 1_000_000_000); { let contexts = context::contexts(); @@ -35,9 +35,20 @@ pub fn nanosleep(req: &TimeSpec, rem_opt: Option<&mut TimeSpec>) -> Result<usize unsafe { context::switch(); } if let Some(rem) = rem_opt { - //TODO let current = time::monotonic(); - rem.tv_sec = 0; - rem.tv_nsec = 0; + let current = time::monotonic(); + + if current.0 < end.0 || (current.0 == end.0 && current.1 < end.1) { + if end.1 < current.1 { + end.0 -= 1; + end.1 += 1_000_000_000; + } + + rem.tv_sec = (end.0 - current.0) as i64; + rem.tv_nsec = (end.1 - current.1) as i32; + } else { + rem.tv_sec = 0; + rem.tv_nsec = 0; + } } Ok(0) -- GitLab