# HG changeset patch # User Paul Eggert # Date 1309028120 25200 # Node ID b4b10d174a9dbe0eac4444e70229aefaaf8fd3cf # Parent c0796192673c8392090c2b8af89bf67b55aa577e 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 --- 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 --- a/lib/nanosleep.c +++ b/lib/nanosleep.c @@ -65,7 +65,7 @@ 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 @@ 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); } }