summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2005-04-09 04:52:25 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2005-04-09 04:52:25 +0000
commite4abcff12f0ab2ec6db42213508eb0e6ccf24624 (patch)
treed3671a3d59e150fdf35064bf541c009cb2a40b63 /lib
parenta3d3cf669ce3a225c970582e61dc26abdfe46578 (diff)
downloadcoreutils-e4abcff12f0ab2ec6db42213508eb0e6ccf24624.tar.xz
(rpl_nanosleep): Include "timespec.h" before macros
that might redefine system include files. (siginterrupt) [!HAVE_SIGINTERRUPT]: New macro. (my_usleep): Use NULL rather than (void *) 0. (rpl_nanosleep) [!defined SA_NOCLDSTOP]: Use siginterrupt to specify that system calls should be interrupted. (rpl_nanosleep): Move initialization of suspended closer to call of my_usleep.
Diffstat (limited to 'lib')
-rw-r--r--lib/nanosleep.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/nanosleep.c b/lib/nanosleep.c
index 2f91c31d8..6d849d7af 100644
--- a/lib/nanosleep.c
+++ b/lib/nanosleep.c
@@ -1,5 +1,5 @@
/* Provide a replacement for the POSIX nanosleep function.
- Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -34,6 +34,8 @@
# include <unistd.h>
#endif
+#include "timespec.h"
+
/* Some systems (MSDOS) don't have SIGCONT.
Using SIGTERM here turns the signal-handling code below
into a no-op on such systems. */
@@ -41,7 +43,9 @@
# define SIGCONT SIGTERM
#endif
-#include "timespec.h"
+#if ! HAVE_SIGINTERRUPT
+# define siginterrupt(sig, flag) /* empty */
+#endif
static sig_atomic_t volatile suspended;
@@ -66,7 +70,7 @@ my_usleep (const struct timespec *ts_delay)
tv_delay.tv_sec++;
tv_delay.tv_usec = 0;
}
- select (0, (void *) 0, (void *) 0, (void *) 0, &tv_delay);
+ select (0, NULL, NULL, NULL, &tv_delay);
}
/* FIXME: comment */
@@ -77,16 +81,11 @@ rpl_nanosleep (const struct timespec *requested_delay,
{
static bool initialized;
-#ifdef SA_NOCLDSTOP
- struct sigaction oldact, newact;
-#endif
-
- suspended = 0;
-
/* set up sig handler */
if (! initialized)
{
#ifdef SA_NOCLDSTOP
+ struct sigaction oldact, newact;
newact.sa_handler = sighandler;
sigemptyset (&newact.sa_mask);
newact.sa_flags = 0;
@@ -96,11 +95,16 @@ rpl_nanosleep (const struct timespec *requested_delay,
sigaction (SIGCONT, &newact, NULL);
#else
if (signal (SIGCONT, SIG_IGN) != SIG_IGN)
- signal (SIGCONT, sighandler);
+ {
+ signal (SIGCONT, sighandler);
+ siginterrupt (SIGCONT, 1);
+ }
#endif
initialized = true;
}
+ suspended = 0;
+
my_usleep (requested_delay);
if (suspended)