nanosleep: simplify carrying
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 25 Jun 2011 18:55:20 +0000 (11:55 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 25 Jun 2011 18:55:20 +0000 (11:55 -0700)
* 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.

ChangeLog
lib/nanosleep.c

index 14d3b0bdf4f4135061bb40036c389b8449632d96..8e39acf2cd4085ea0fcedfdccb01710d9f7e77ca 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2011-06-25  Paul Eggert  <eggert@cs.ucla.edu>
 
+       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.
index ab5cc8986468917273690d0b93084e78cf160aed..aae2653b722cad467ef9388f5c52d8e13789f4a2 100644 (file)
@@ -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);
   }
 }