[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2] lib/nolibc: Fix remaining time in nanosleep
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; } -- 2.17.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |