|
[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
Hi Dafna,
Your changes should also go to the newlib glue code. This file (time.c)
was taken from there.
As a suggestion, maybe we should find a better solution for replicating
the changes there (e.g. a symbolic link in the newlib glue code
referencing this file in nolibc).
Cheers,
Costin
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;
> }
>
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |