From: Paul Eggert Date: Thu, 30 Jun 2011 22:23:29 +0000 (-0700) Subject: xnanosleep: Rewrite to use new dtotimespec module. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f079339abe711a3b188bfef58dd1f8a5366b1ec;p=pspp xnanosleep: Rewrite to use new dtotimespec module. It has the conversion code that used to be in xnanosleep. * lib/xnanosleep.c: Do not include limits.h, stdbool.h, stdio.h, assert.h, sys/types.h, or intprops.h. Include timespec.h instead. (TIME_T_MAX): Remove. (xnanosleep): Rewrite in terms of dtotimespec. * modules/xnanosleep (Depends-on): Add dtotimespec. Remove intprops, stdbool. --- diff --git a/ChangeLog b/ChangeLog index 2369b42759..fcc2e6efe3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2011-06-30 Paul Eggert + xnanosleep: Rewrite to use new dtotimespec module. + It has the conversion code that used to be in xnanosleep. + * lib/xnanosleep.c: Do not include limits.h, stdbool.h, stdio.h, + assert.h, sys/types.h, or intprops.h. Include timespec.h instead. + (TIME_T_MAX): Remove. + (xnanosleep): Rewrite in terms of dtotimespec. + * modules/xnanosleep (Depends-on): Add dtotimespec. + Remove intprops, stdbool. + timespec-add, timespec-sub: new modules * lib/timespec.h (timespec_add, timespec_sub): New decls. * lib/timespec-add.c, lib/timespec-sub.c: diff --git a/lib/xnanosleep.c b/lib/xnanosleep.c index 74cb895303..442ddf5c20 100644 --- a/lib/xnanosleep.c +++ b/lib/xnanosleep.c @@ -22,20 +22,11 @@ #include "xnanosleep.h" -#include -#include -#include -#include +#include + #include -#include #include -#include "intprops.h" - -#ifndef TIME_T_MAX -# define TIME_T_MAX TYPE_MAXIMUM (time_t) -#endif - /* Sleep until the time (call it WAKE_UP_TIME) specified as SECONDS seconds after the time this function is called. SECONDS must be non-negative. If SECONDS is so large that @@ -46,61 +37,10 @@ int xnanosleep (double seconds) { - enum { BILLION = 1000000000 }; - - /* For overflow checking, use naive comparison if possible, widening - to long double if double is not wide enough. Otherwise, use <=, - not <, to avoid problems when TIME_T_MAX is less than SECONDS but - compares equal to SECONDS after loss of precision when coercing - from time_t to long double. This mishandles near-maximal values - in some rare (perhaps theoretical) cases but that is better than - undefined behavior. */ - bool overflow = ((time_t) ((double) TIME_T_MAX / 2) == TIME_T_MAX / 2 - ? TIME_T_MAX < seconds - : (time_t) ((long double) TIME_T_MAX / 2) == TIME_T_MAX / 2 - ? TIME_T_MAX < (long double) seconds - : TIME_T_MAX <= (long double) seconds); - - struct timespec ts_sleep; - - assert (0 <= seconds); - - /* Separate whole seconds from nanoseconds. */ - if (! overflow) - { - time_t floor_seconds = seconds; - double ns = BILLION * (seconds - floor_seconds); - ts_sleep.tv_sec = floor_seconds; - - /* Round up to the next whole number, if necessary, so that we - always sleep for at least the requested amount of time. Assuming - the default rounding mode, we don't have to worry about the - rounding error when computing 'ns' above, since the error won't - cause 'ns' to drop below an integer boundary. */ - ts_sleep.tv_nsec = ns; - ts_sleep.tv_nsec += (ts_sleep.tv_nsec < ns); - - /* Normalize the interval length. nanosleep requires this. */ - if (BILLION <= ts_sleep.tv_nsec) - { - if (ts_sleep.tv_sec == TIME_T_MAX) - overflow = true; - else - { - ts_sleep.tv_sec++; - ts_sleep.tv_nsec -= BILLION; - } - } - } + struct timespec ts_sleep = dtotimespec (seconds); for (;;) { - if (overflow) - { - ts_sleep.tv_sec = TIME_T_MAX; - ts_sleep.tv_nsec = BILLION - 1; - } - /* Linux-2.6.8.1's nanosleep returns -1, but doesn't set errno when resumed after being suspended. Earlier versions would set errno to EINTR. nanosleep from linux-2.6.10, as well as diff --git a/modules/xnanosleep b/modules/xnanosleep index f1b1371dd7..0a2b373eac 100644 --- a/modules/xnanosleep +++ b/modules/xnanosleep @@ -7,10 +7,9 @@ lib/xnanosleep.c m4/xnanosleep.m4 Depends-on: +dtotimespec nanosleep time -intprops -stdbool configure.ac: gl_XNANOSLEEP