changeset 5665:ec3cc8a95f16

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. * 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.
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 01 Mar 2005 17:25:09 +0000
parents 13311bdb333d
children fa944df25e37
files ChangeLog lib/ChangeLog lib/xnanosleep.c m4/ChangeLog m4/xnanosleep.m4 modules/xnanosleep
diffstat 6 files changed, 28 insertions(+), 63 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -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.
--- a/lib/xnanosleep.c
+++ b/lib/xnanosleep.c
@@ -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))
@@ -48,19 +46,6 @@
 # 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 @@
   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 @@
 	  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;
--- a/m4/ChangeLog
+++ b/m4/ChangeLog
@@ -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.
--- a/m4/xnanosleep.m4
+++ b/m4/xnanosleep.m4
@@ -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_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])
 ])
--- a/modules/xnanosleep
+++ b/modules/xnanosleep
@@ -8,7 +8,6 @@
 
 Depends-on:
 timespec
-gethrxtime
 
 configure.ac:
 gl_XNANOSLEEP