Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/nanosleep.c @ 5159:a535859efd14
Merge from coreutils.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Sat, 07 Aug 2004 00:09:38 +0000 |
parents | 4e59cddb690f |
children | 6962b5c5069f |
rev | line source |
---|---|
2052 | 1 /* Provide a replacement for the POSIX nanosleep function. |
5060
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
2 Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc. |
2052 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program; if not, write to the Free Software Foundation, | |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
17 | |
18 /* written by Jim Meyering */ | |
19 | |
20 #include <config.h> | |
2270 | 21 |
22 /* Undefine nanosleep here so any prototype is not redefined to be a | |
23 prototype for rpl_nanosleep. (they'd conflict e.g., on alpha-dec-osf3.2) */ | |
24 #undef nanosleep | |
25 | |
5159 | 26 #include <stdbool.h> |
2053 | 27 #include <stdio.h> |
2052 | 28 #include <sys/types.h> |
2053 | 29 #include <signal.h> |
2052 | 30 |
2057 | 31 #include <errno.h> |
32 | |
2056 | 33 #if HAVE_UNISTD_H |
34 # include <unistd.h> | |
35 #endif | |
36 | |
2687
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
37 /* Some systems (MSDOS) don't have SIGCONT. |
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
38 Using SIGTERM here turns the signal-handling code below |
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
39 into a no-op on such systems. */ |
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
40 #ifndef SIGCONT |
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
41 # define SIGCONT SIGTERM |
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
42 #endif |
34703e371994
(SIGCONT): Define if not already defined.
Jim Meyering <jim@meyering.net>
parents:
2341
diff
changeset
|
43 |
3767
e22be96e00a6
Reflect renaming: nanosleep.h -> timespec.h.
Jim Meyering <jim@meyering.net>
parents:
2687
diff
changeset
|
44 #include "timespec.h" |
2052 | 45 |
5060
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
46 static sig_atomic_t volatile suspended; |
2052 | 47 |
2053 | 48 /* Handle SIGCONT. */ |
49 | |
50 static void | |
51 sighandler (int sig) | |
52 { | |
53 suspended = 1; | |
54 } | |
55 | |
2058 | 56 /* FIXME: comment */ |
2052 | 57 |
58 static void | |
2056 | 59 my_usleep (const struct timespec *ts_delay) |
2052 | 60 { |
61 struct timeval tv_delay; | |
62 tv_delay.tv_sec = ts_delay->tv_sec; | |
5060
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
63 tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000; |
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
64 if (tv_delay.tv_usec == 1000000) |
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
65 { |
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
66 tv_delay.tv_sec++; |
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
67 tv_delay.tv_usec = 0; |
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
68 } |
2056 | 69 select (0, (void *) 0, (void *) 0, (void *) 0, &tv_delay); |
2052 | 70 } |
71 | |
2058 | 72 /* FIXME: comment */ |
73 | |
2052 | 74 int |
2270 | 75 rpl_nanosleep (const struct timespec *requested_delay, |
2341 | 76 struct timespec *remaining_delay) |
2052 | 77 { |
5159 | 78 static bool initialized; |
5060
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
79 |
2151 | 80 #ifdef SA_NOCLDSTOP |
2053 | 81 struct sigaction oldact, newact; |
82 #endif | |
83 | |
2056 | 84 suspended = 0; |
2052 | 85 |
2058 | 86 /* set up sig handler */ |
5060
4e59cddb690f
nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents:
3767
diff
changeset
|
87 if (! initialized) |
2058 | 88 { |
2151 | 89 #ifdef SA_NOCLDSTOP |
2058 | 90 newact.sa_handler = sighandler; |
91 sigemptyset (&newact.sa_mask); | |
92 newact.sa_flags = 0; | |
2053 | 93 |
2058 | 94 sigaction (SIGCONT, NULL, &oldact); |
95 if (oldact.sa_handler != SIG_IGN) | |
96 sigaction (SIGCONT, &newact, NULL); | |
2053 | 97 #else |
2058 | 98 if (signal (SIGCONT, SIG_IGN) != SIG_IGN) |
99 signal (SIGCONT, sighandler); | |
2053 | 100 #endif |
5159 | 101 initialized = true; |
2058 | 102 } |
2052 | 103 |
2056 | 104 my_usleep (requested_delay); |
2052 | 105 |
2056 | 106 if (suspended) |
2052 | 107 { |
108 /* Calculate time remaining. */ | |
109 /* FIXME: the code in sleep doesn't use this, so there's no | |
110 rush to implement it. */ | |
2058 | 111 |
112 errno = EINTR; | |
2052 | 113 } |
114 | |
115 /* FIXME: Restore sig handler? */ | |
116 | |
2056 | 117 return suspended; |
2052 | 118 } |