From: Paul Eggert Date: Sat, 25 Jun 2011 18:55:20 +0000 (-0700) Subject: nanosleep: simplify carrying X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4c53bb2f7c0a05e9795da46ea3ddc17b2ef0c78;p=pspp nanosleep: simplify carrying * lib/nanosleep.c (nanosleep): Use the requested tv_nsec for the first call to the underyling nanosleep, not for the last one. This doesn't fix any bugs, but it simplifies the computation of the remaining delay. Found while auditing integer overflow issues. --- diff --git a/ChangeLog b/ChangeLog index 14d3b0bdf4..8e39acf2cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2011-06-25 Paul Eggert + nanosleep: simplify carrying + * lib/nanosleep.c (nanosleep): Use the requested tv_nsec for the + first call to the underyling nanosleep, not for the last one. + This doesn't fix any bugs, but it simplifies the computation of + the remaining delay. Found while auditing integer overflow issues. + dup2: remove test for existence of fcntl * m4/dup2.m4 (gl_FUNC_DUP2): Use "#ifdef FD_CLOEXEC", not "#if HAVE_FCNTL", in the configure-time test program. diff --git a/lib/nanosleep.c b/lib/nanosleep.c index ab5cc89864..aae2653b72 100644 --- a/lib/nanosleep.c +++ b/lib/nanosleep.c @@ -65,7 +65,7 @@ nanosleep (const struct timespec *requested_delay, const time_t limit = 24 * 24 * 60 * 60; time_t seconds = requested_delay->tv_sec; struct timespec intermediate; - intermediate.tv_nsec = 0; + intermediate.tv_nsec = requested_delay->tv_nsec; while (limit < seconds) { @@ -76,20 +76,12 @@ nanosleep (const struct timespec *requested_delay, if (result) { if (remaining_delay) - { - remaining_delay->tv_sec += seconds; - remaining_delay->tv_nsec += requested_delay->tv_nsec; - if (BILLION <= requested_delay->tv_nsec) - { - remaining_delay->tv_sec++; - remaining_delay->tv_nsec -= BILLION; - } - } + remaining_delay->tv_sec += seconds; return result; } + intermediate.tv_nsec = 0; } intermediate.tv_sec = seconds; - intermediate.tv_nsec = requested_delay->tv_nsec; return nanosleep (&intermediate, remaining_delay); } }