From: Paul Eggert Date: Tue, 1 Mar 2005 17:25:09 +0000 (+0000) Subject: Remove workaround for bug in Linux kernel 2.6.8 or thereabouts. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=757c9899f9035e2a71fa2c5710b0a0a4d620ad98;p=pspp 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. --- diff --git a/ChangeLog b/ChangeLog index c01a283610..3c7763db55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-03-01 Paul Eggert + + * modules/xnanosleep (Depends-on): Remove gethrxtime. + 2005-02-26 Paul Eggert * modules/gethrxtime: New file. diff --git a/lib/ChangeLog b/lib/ChangeLog index 572319aab5..dc6bc11eff 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,13 @@ +2005-03-01 Paul Eggert + + 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 * vasnprintf.c (EOVERFLOW): Define to a fallback if needed. diff --git a/lib/xnanosleep.c b/lib/xnanosleep.c index 8aa5e8a8de..fcfe3d551d 100644 --- a/lib/xnanosleep.c +++ b/lib/xnanosleep.c @@ -33,8 +33,6 @@ #include #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 @@ 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; diff --git a/m4/ChangeLog b/m4/ChangeLog index 3926384ea6..2d39f2446a 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,8 @@ +2005-03-01 Paul Eggert + + * xnanosleep.m4 (gl_XNANOSLEEP): Remove configuration attempting + to detect nanosleep bug. + 2005-02-25 Paul Eggert * gethrxtime.m4, xnanosleep.m4: New files. diff --git a/m4/xnanosleep.m4 b/m4/xnanosleep.m4 index b7866538dd..f030bc1bba 100644 --- 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_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]) ]) diff --git a/modules/xnanosleep b/modules/xnanosleep index 08a3828f41..18abf00981 100644 --- a/modules/xnanosleep +++ b/modules/xnanosleep @@ -8,7 +8,6 @@ m4/xnanosleep.m4 Depends-on: timespec -gethrxtime configure.ac: gl_XNANOSLEEP