X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fnanosleep.c;h=7a7cc02fd987c9cf8d77ec0f0533b11b6ce80c20;hb=fa3486514bd8f15f8eb4c49821d0356b52e5a335;hp=fe22a97cabac69e955e2c10c6575e71e571f4716;hpb=0632e115747ff96e93330c88f536d7354a7ce507;p=gnulib.git diff --git a/lib/nanosleep.c b/lib/nanosleep.c index fe22a97ca..7a7cc02fd 100644 --- a/lib/nanosleep.c +++ b/lib/nanosleep.c @@ -1,12 +1,12 @@ /* Provide a replacement for the POSIX nanosleep function. - Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006 Free Software - Foundation, Inc. + Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006, 2007, 2008 Free + Software Foundation, Inc. - This program is free software; you can redistribute it and/or modify + 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 - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,47 +14,35 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* written by Jim Meyering */ #include -/* Undefine nanosleep here so any prototype is not redefined to be a - prototype for rpl_nanosleep. (they'd conflict e.g., on alpha-dec-osf3.2) */ -#undef nanosleep +#include + +#include "sig-handler.h" +#include "timespec.h" #include #include #include -#if HAVE_SYS_SELECT_H -# include -#endif +#include #include -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include #include -#include "timespec.h" +#undef nanosleep enum { BILLION = 1000 * 1000 * 1000 }; #if HAVE_BUG_BIG_NANOSLEEP -void +static void getnow (struct timespec *t) { # if defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME @@ -115,10 +103,6 @@ rpl_nanosleep (const struct timespec *requested_delay, # define SIGCONT SIGTERM # endif -# if ! HAVE_SIGINTERRUPT -# define siginterrupt(sig, flag) /* empty */ -# endif - static sig_atomic_t volatile suspended; /* Handle SIGCONT. */ @@ -163,22 +147,18 @@ rpl_nanosleep (const struct timespec *requested_delay, /* 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; + struct sigaction oldact; sigaction (SIGCONT, NULL, &oldact); - if (oldact.sa_handler != SIG_IGN) - sigaction (SIGCONT, &newact, NULL); -# else - if (signal (SIGCONT, SIG_IGN) != SIG_IGN) + if (get_handler (&oldact) != SIG_IGN) { - signal (SIGCONT, sighandler); - siginterrupt (SIGCONT, 1); + struct sigaction newact; + + newact.sa_handler = sighandler; + sigemptyset (&newact.sa_mask); + newact.sa_flags = 0; + sigaction (SIGCONT, &newact, NULL); } -# endif initialized = true; }