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