From db042d202252bf0372b033775ffcffa23e826ac2 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Mon, 28 Feb 2005 10:02:58 +0000 Subject: [PATCH] (xnanosleep): Work around bug in Linux-2.6.8.1's nanosleep whereby it fails without setting errno upon being resumed after being suspended. --- lib/xnanosleep.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/xnanosleep.c b/lib/xnanosleep.c index 8aa5e8a8de..5ac9f2ecd9 100644 --- a/lib/xnanosleep.c +++ b/lib/xnanosleep.c @@ -123,9 +123,16 @@ 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) -- 2.47.3