Remove workaround for bug in Linux kernel 2.6.8 or thereabouts.
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 1 Mar 2005 17:25:09 +0000 (17:25 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 1 Mar 2005 17:25:09 +0000 (17:25 +0000)
The workaround isn't strictly needed for POSIX conformance, and
it's too much of a pain to configure and maintain.  We'll ask
people to fix their kernels instead.
* modules/xnanosleep (Depends-on): Remove gethrxtime.
* lib/xnanosleep.c: Don't include gethrxtime.h or xtime.h.
(NANOSLEEP_BUG_WORKAROUND): Remove.
(xnanosleep): Remove the workaround.
* m4/xnanosleep.m4 (gl_XNANOSLEEP): Remove configuration attempting
to detect nanosleep bug.

ChangeLog
lib/ChangeLog
lib/xnanosleep.c
m4/ChangeLog
m4/xnanosleep.m4
modules/xnanosleep

index c01a283610d23acaa0ffc75c36cb235ff6bc74ae..3c7763db5576977baf05bb98643ad910065052fb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-03-01  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * modules/xnanosleep (Depends-on): Remove gethrxtime.
+
 2005-02-26  Paul Eggert  <eggert@cs.ucla.edu>
 
        * modules/gethrxtime: New file.
index 572319aab5f5d8d11cbf58d30369d128425b2c60..dc6bc11eff1488dc811bf4fa52eb35ed25a0cfeb 100644 (file)
@@ -1,3 +1,13 @@
+2005-03-01  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Remove workaround for bug in Linux kernel 2.6.8 or thereabouts.
+       The workaround isn't strictly needed for POSIX conformance, and
+       it's too much of a pain to configure and maintain.  We'll ask
+       people to fix their kernels instead.
+       * xnanosleep.c: Don't include gethrxtime.h or xtime.h.
+       (NANOSLEEP_BUG_WORKAROUND): Remove.
+       (xnanosleep): Remove the workaround.
+
 2005-02-12  Bruno Haible  <bruno@clisp.org>
 
        * vasnprintf.c (EOVERFLOW): Define to a fallback if needed.
index 8aa5e8a8de68c502f8499521e23e99db71fb00eb..fcfe3d551dfe2dc7d7e5ec0810f14a93008e613a 100644 (file)
@@ -33,8 +33,6 @@
 #include <time.h>
 
 #include "timespec.h"
-#include "gethrxtime.h"
-#include "xtime.h"
 
 /* The extra casts work around common compiler bugs.  */
 #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
 # define TIME_T_MAX TYPE_MAXIMUM (time_t)
 #endif
 
-/* POSIX.1-2001 requires that when a process is suspended, then
-   resumed, nanosleep (A, B) returns -1, sets errno to EINTR, and sets
-   *B to the time remaining at the point of resumption.  However, some
-   versions of the Linux kernel incorrectly return the time remaining
-   at the point of suspension.  Work around this bug on GNU/Linux
-   hosts by computing the remaining time here after nanosleep returns,
-   rather than by relying on nanosleep's computation.  */
-#ifdef __linux__
-enum { NANOSLEEP_BUG_WORKAROUND = true };
-#else
-enum { NANOSLEEP_BUG_WORKAROUND = false };
-#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
@@ -76,19 +61,9 @@ xnanosleep (double seconds)
   bool overflow = false;
   double ns;
   struct timespec ts_sleep;
-  xtime_t stop = 0;
 
   assert (0 <= seconds);
 
-  if (NANOSLEEP_BUG_WORKAROUND)
-    {
-      xtime_t now = gethrxtime ();
-      double increment = XTIME_PRECISION * seconds;
-      xtime_t incr = increment;
-      stop = now + incr + (incr < increment);
-      overflow = (stop < now);
-    }
-
   /* Separate whole seconds from nanoseconds.
      Be careful to detect any overflow.  */
   ts_sleep.tv_sec = seconds;
@@ -123,23 +98,17 @@ xnanosleep (double seconds)
          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
+        implementations by (all?) other vendors, doesn't return -1
+        in that case;  either it continues sleeping (if time remains)
+        or it returns zero (if the wake-up time has passed).  */
+      errno = 0;
       if (nanosleep (&ts_sleep, NULL) == 0)
        break;
-      if (errno != EINTR)
+      if (errno != EINTR && errno != 0)
        return -1;
-
-      if (NANOSLEEP_BUG_WORKAROUND)
-       {
-         xtime_t now = gethrxtime ();
-         if (stop <= now)
-           break;
-         else
-           {
-             xtime_t remaining = stop - now;
-             ts_sleep.tv_sec = xtime_nonnegative_sec (remaining);
-             ts_sleep.tv_nsec = xtime_nonnegative_nsec (remaining);
-           }
-       }
     }
 
   return 0;
index 3926384ea65ec882cf892df61011f6ef845767de..2d39f2446a877bf161bcf94eb1de3983fa0c253d 100644 (file)
@@ -1,3 +1,8 @@
+2005-03-01  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * xnanosleep.m4 (gl_XNANOSLEEP): Remove configuration attempting
+       to detect nanosleep bug.
+
 2005-02-25  Paul Eggert  <eggert@cs.ucla.edu>
 
        * gethrxtime.m4, xnanosleep.m4: New files.
index b7866538ddefd1ace9d755a8276c826b09438bad..f030bc1bba78e0b7a55dae2ac02c8d7b570dadc9 100644 (file)
@@ -1,4 +1,4 @@
-# xnanosleep.m4 serial 1
+# xnanosleep.m4 serial 2
 dnl Copyright (C) 2005 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -10,26 +10,4 @@ AC_DEFUN([gl_XNANOSLEEP],
 [
   AC_LIBSOURCES([xnanosleep.c, xnanosleep.h])
   AC_LIBOBJ([xnanosleep])
-
-  dnl Prerequisites of lib/xnanosleep.c.
-  AC_REQUIRE([gl_PREREQ_GETHRXTIME])
-
-  LIB_XNANOSLEEP=
-  case $LIB_GETHRXTIME in
-  ?*)
-    AC_CACHE_CHECK([whether __linux__ is defined],
-      gl_cv_have___linux__,
-      [AC_EGREP_CPP([have___linux__],
-       [
-#        ifdef __linux__
-         have___linux__
-#        endif
-       ],
-       gl_cv_have___linux__=yes,
-       gl_cv_have___linux__=no)])
-    if test $gl_cv_have___linux__ = yes; then
-      LIB_XNANOSLEEP=$LIB_GETHRXTIME
-    fi;;
-  esac
-  AC_SUBST([LIB_XNANOSLEEP])
 ])
index 08a3828f41db27dc1f2474b733160035e5181716..18abf00981d15875ff0aea185071ae859fe032cf 100644 (file)
@@ -8,7 +8,6 @@ m4/xnanosleep.m4
 
 Depends-on:
 timespec
-gethrxtime
 
 configure.ac:
 gl_XNANOSLEEP