[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT PATCH v2] lib/nolibc: Fix remaining time in nanosleep



Reviewed-by: Florian Schmidt <florian.schmidt@xxxxxxxxx>

Thank you for the patch! Do you want to look into the newlib glue code, as Costin mentioned? It's basically a very similar patch updating the glue function for nanosleep() there. Otherwise one of us will do it soon(tm).

Cheers,
Florian

On 09/04/2018 10:36 PM, Dafna Hirschfeld wrote:
Calculate the remaining time to sleep and update
the rem parameter if it is given.
If the remaining time is larger than 0, it means that
the thread was waken up explicitly and nanosleep returns -1
to indicate that. Otherwise nanosleep returns 0

Signed-off-by: Dafna Hirschfeld <dafna3@xxxxxxxxx>
---
  lib/nolibc/time.c | 22 ++++++++++++++++++----
  1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/lib/nolibc/time.c b/lib/nolibc/time.c
index 1c058ae..9e3e24e 100644
--- a/lib/nolibc/time.c
+++ b/lib/nolibc/time.c
@@ -59,9 +59,16 @@ static void __spin_wait(__nsec nsec)
int nanosleep(const struct timespec *req, struct timespec *rem)
  {
-       __nsec nsec = (__nsec) req->tv_sec * 1000000000L;
+       __nsec before, after, diff, nsec;
+ if (!req || req->tv_nsec < 0 || req->tv_nsec > 999999999) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       nsec = (__nsec) req->tv_sec * 1000000000L;
        nsec += req->tv_nsec;
+       before = ukplat_monotonic_clock();
#if CONFIG_HAVE_SCHED
        uk_sched_thread_sleep(nsec);
@@ -69,9 +76,16 @@ int nanosleep(const struct timespec *req, struct timespec 
*rem)
        __spin_wait(nsec);
  #endif
- if (rem) {
-               rem->tv_sec = 0;
-               rem->tv_nsec = 0;
+       after = ukplat_monotonic_clock();
+       diff = after - before;
+
+       if (diff < nsec) {
+               if (rem) {
+                       rem->tv_sec = ukarch_time_nsec_to_sec(nsec - diff);
+                       rem->tv_nsec = ukarch_time_subsec(nsec - diff);
+               }
+               errno = EINTR;
+               return -1;
        }
        return 0;
  }


--
Dr. Florian Schmidt
フローリアン・シュミット
Research Scientist,
Systems and Machine Learning Group
NEC Laboratories Europe
Kurfürsten-Anlage 36, D-69115 Heidelberg
Tel.     +49 (0)6221 4342-265
Fax:     +49 (0)6221 4342-155
e-mail:  florian.schmidt@xxxxxxxxx
============================================================
Registered at Amtsgericht Mannheim, Germany, HRB728558

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.