summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/sleep.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1997-07-18 09:48:37 +0000
committerpeter <peter@FreeBSD.org>1997-07-18 09:48:37 +0000
commit8bdc2de5821f86489ee2b3500d24c78570667f56 (patch)
treef14b615c97e6587a56e0a7484c586beddb3745e6 /lib/libc/gen/sleep.c
parent09554020d9393d25e63e54da02b144c5aca0832c (diff)
downloadFreeBSD-src-8bdc2de5821f86489ee2b3500d24c78570667f56.zip
FreeBSD-src-8bdc2de5821f86489ee2b3500d24c78570667f56.tar.gz
Make sleep() and usleep() "eat" any stray SIGALRM signals during the
lifetime of the call, just like the old implementation did. Previously, we were only eating them if the application did not call sleep()/usleep() with SIGALRM masked. Submitted by: ache
Diffstat (limited to 'lib/libc/gen/sleep.c')
-rw-r--r--lib/libc/gen/sleep.c40
1 files changed, 15 insertions, 25 deletions
diff --git a/lib/libc/gen/sleep.c b/lib/libc/gen/sleep.c
index 49f2d89..36348bc 100644
--- a/lib/libc/gen/sleep.c
+++ b/lib/libc/gen/sleep.c
@@ -73,45 +73,35 @@ sleep(seconds)
struct timespec time_remaining;
struct sigaction act, oact;
sigset_t mask, omask;
- int alarm_blocked;
if (seconds != 0) {
time_to_sleep.tv_sec = seconds;
time_to_sleep.tv_nsec = 0;
- /* Block SIGALRM while fiddling with it */
+ /*
+ * Set up handler to interrupt signanosleep and ensure
+ * SIGARLM is not blocked. Block SIGALRM while fiddling
+ * with things.
+ */
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sleephandler;
sigemptyset(&mask);
sigaddset(&mask, SIGALRM);
sigprocmask(SIG_BLOCK, &mask, &omask);
-
- /* Was SIGALRM blocked already? */
- alarm_blocked = sigismember(&omask, SIGALRM);
-
- if (!alarm_blocked) {
- /*
- * Set up handler to interrupt signanosleep only if
- * SIGALRM was unblocked. (Save some syscalls)
- */
- memset(&act, 0, sizeof(act));
- act.sa_handler = sleephandler;
- sigaction(SIGALRM, &act, &oact);
- }
+ sigaction(SIGALRM, &act, &oact);
+ mask = omask;
+ sigdelset(&mask, SIGALRM);
/*
* signanosleep() uses the given mask for the lifetime of
* the syscall only - it resets on return. Note that the
- * Old sleep explicitly unblocks SIGALRM during the sleep,
- * we don't do that now since we don't depend on SIGALRM
- * to end the timout. If the process blocks SIGALRM, it
- * gets what it asks for.
+ * old sleep explicitly unblocks SIGALRM during the sleep.
*/
- signanosleep(&time_to_sleep, &time_remaining, &omask);
+ signanosleep(&time_to_sleep, &time_remaining, &mask);
- if (!alarm_blocked) {
- /* Unwind */
- sigaction(SIGALRM, &oact, (struct sigaction *)0);
- sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
- }
+ /* Unwind */
+ sigaction(SIGALRM, &oact, (struct sigaction *)0);
+ sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
/* return how long is left */
seconds = time_remaining.tv_sec;
OpenPOWER on IntegriCloud