(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.
This commit is contained in:
Paul Eggert
2005-04-09 04:52:25 +00:00
parent a3d3cf669c
commit e4abcff12f
+14 -10
View File
@@ -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)