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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
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
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
3
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
6 the Free Software Foundation; either version 2, or (at your option)
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
7 any later version.
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
8
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
12 GNU General Public License for more details.
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
13
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
15 along with this program; if not, write to the Free Software Foundation,
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
17
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
18 /* written by Jim Meyering */
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
19
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
20 #include <config.h>
2270
cf5eb0c29b04 #undef nanosleep.
Jim Meyering <jim@meyering.net>
parents: 2151
diff changeset
21
cf5eb0c29b04 #undef nanosleep.
Jim Meyering <jim@meyering.net>
parents: 2151
diff changeset
22 /* Undefine nanosleep here so any prototype is not redefined to be a
cf5eb0c29b04 #undef nanosleep.
Jim Meyering <jim@meyering.net>
parents: 2151
diff changeset
23 prototype for rpl_nanosleep. (they'd conflict e.g., on alpha-dec-osf3.2) */
cf5eb0c29b04 #undef nanosleep.
Jim Meyering <jim@meyering.net>
parents: 2151
diff changeset
24 #undef nanosleep
cf5eb0c29b04 #undef nanosleep.
Jim Meyering <jim@meyering.net>
parents: 2151
diff changeset
25
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5060
diff changeset
26 #include <stdbool.h>
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
27 #include <stdio.h>
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
28 #include <sys/types.h>
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
29 #include <signal.h>
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
30
2057
50da17269b1b *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2056
diff changeset
31 #include <errno.h>
50da17269b1b *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2056
diff changeset
32
2056
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
33 #if HAVE_UNISTD_H
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
34 # include <unistd.h>
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
35 #endif
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
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
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
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
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
47
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
48 /* Handle SIGCONT. */
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
49
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
50 static void
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
51 sighandler (int sig)
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
52 {
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
53 suspended = 1;
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
54 }
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
55
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
56 /* FIXME: comment */
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
57
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
58 static void
2056
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
59 my_usleep (const struct timespec *ts_delay)
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
60 {
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
61 struct timeval tv_delay;
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
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
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
69 select (0, (void *) 0, (void *) 0, (void *) 0, &tv_delay);
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
70 }
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
71
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
72 /* FIXME: comment */
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
73
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
74 int
2270
cf5eb0c29b04 #undef nanosleep.
Jim Meyering <jim@meyering.net>
parents: 2151
diff changeset
75 rpl_nanosleep (const struct timespec *requested_delay,
2341
12885d185e68 tweak indentation
Jim Meyering <jim@meyering.net>
parents: 2270
diff changeset
76 struct timespec *remaining_delay)
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
77 {
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5060
diff changeset
78 static bool initialized;
5060
4e59cddb690f nanosleep merge from coreutils
Paul Eggert <eggert@cs.ucla.edu>
parents: 3767
diff changeset
79
2151
9aca0b7cb4cc (nanosleep):
Jim Meyering <jim@meyering.net>
parents: 2077
diff changeset
80 #ifdef SA_NOCLDSTOP
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
81 struct sigaction oldact, newact;
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
82 #endif
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
83
2056
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
84 suspended = 0;
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
85
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
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
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
88 {
2151
9aca0b7cb4cc (nanosleep):
Jim Meyering <jim@meyering.net>
parents: 2077
diff changeset
89 #ifdef SA_NOCLDSTOP
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
90 newact.sa_handler = sighandler;
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
91 sigemptyset (&newact.sa_mask);
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
92 newact.sa_flags = 0;
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
93
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
94 sigaction (SIGCONT, NULL, &oldact);
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
95 if (oldact.sa_handler != SIG_IGN)
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
96 sigaction (SIGCONT, &newact, NULL);
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
97 #else
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
98 if (signal (SIGCONT, SIG_IGN) != SIG_IGN)
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
99 signal (SIGCONT, sighandler);
2053
0d23f740f281 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2052
diff changeset
100 #endif
5159
a535859efd14 Merge from coreutils.
Paul Eggert <eggert@cs.ucla.edu>
parents: 5060
diff changeset
101 initialized = true;
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
102 }
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
103
2056
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
104 my_usleep (requested_delay);
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
105
2056
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
106 if (suspended)
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
107 {
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
108 /* Calculate time remaining. */
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
109 /* FIXME: the code in sleep doesn't use this, so there's no
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
110 rush to implement it. */
2058
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
111
640074e7d6cd *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2057
diff changeset
112 errno = EINTR;
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
113 }
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
114
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
115 /* FIXME: Restore sig handler? */
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
116
2056
cf3d523888c5 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents: 2053
diff changeset
117 return suspended;
2052
3c79d37078c2 *** empty log message ***
Jim Meyering <jim@meyering.net>
parents:
diff changeset
118 }