* lib/xnanosleep.c (xnanosleep): When the duration is the positive infinity, use pause instead of nanosleep. --- lib/xnanosleep.c | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/lib/xnanosleep.c b/lib/xnanosleep.c index 5774f75f3..58a2f5254 100644 --- a/lib/xnanosleep.c +++ b/lib/xnanosleep.c @@ -25,7 +25,9 @@ #include <timespec.h> #include <errno.h> +#include <math.h> #include <time.h> +#include <unistd.h> /* Sleep until the time (call it WAKE_UP_TIME) specified as SECONDS seconds after the time this function is called. @@ -37,21 +39,33 @@ int xnanosleep (double seconds) { - struct timespec ts_sleep = dtotimespec (seconds); - - for (;;) + if (!isfinite(seconds) && seconds > 0) + { + for (;;) + { + pause(); + if (errno != EINTR) + return -1; + } + } + else { - /* 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 && errno != 0) - return -1; + struct timespec ts_sleep = dtotimespec (seconds); + + for (;;) + { + /* 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 && errno != 0) + return -1; + } } return 0; -- 2.25.0