[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT/NEWLIB PATCH] reimplement nanosleep for new api
Reviewed-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> On 15.06.2018 15:58, Yuri Volchkov wrote: Signed-off-by: Yuri Volchkov <yuri.volchkov@xxxxxxxxx> Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- time.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/time.c b/time.c index 3196ad8..9f12329 100644 --- a/time.c +++ b/time.c @@ -42,6 +42,7 @@ #include <uk/sched.h> #else #include <uk/plat/lcpu.h> +#include <uk/plat/time.h> #endifint@@ -55,23 +56,31 @@ int utime(const char *filename __unused, const struct utimbuf *times __unused) return 0; }-/* currently only have millisecond resolution on timers */-static void msleep(uint32_t milliseconds) +#ifndef CONFIG_HAVE_SCHED +/* Workaround until Unikraft changes interface for something more + * sensible + */ +static void __spin_wait(__nsec nsec) { -#if CONFIG_HAVE_SCHED - uk_sched_sleep(milliseconds); -#else - ukplat_lcpu_halt_to(milliseconds); -#endif + __nsec until = ukplat_monotonic_clock() + nsec; + + while (until > ukplat_monotonic_clock()) + ukplat_lcpu_halt_to(until); } +#endif-/* TODO: nanosleep() does not properly set rem, or return the right value if- * the sleep got interrupted. - * However, we can only fix this once we have a better timer implementation. - */ int nanosleep(const struct timespec *req, struct timespec *rem) { - msleep((req->tv_sec * 1000) + (req->tv_nsec / 1000000)); + __nsec nsec = (__nsec) req->tv_sec * 1000000000L; + + nsec += req->tv_nsec; + +#if CONFIG_HAVE_SCHED + uk_sched_thread_sleep(nsec); +#else + __spin_wait(nsec); +#endif + if (rem) { rem->tv_sec = 0; rem->tv_nsec = 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 |