summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/usleep.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1997-08-12 17:17:53 +0000
committerache <ache@FreeBSD.org>1997-08-12 17:17:53 +0000
commite35ed20ee19b31cb47b121feb166a2d50c0e60fb (patch)
tree2de5efd41ef12fa95b3ffb7915c122d68ef5faec /lib/libc/gen/usleep.c
parent9fc764805ce0599c315781815fc0a3311fa00cb0 (diff)
downloadFreeBSD-src-e35ed20ee19b31cb47b121feb166a2d50c0e60fb.zip
FreeBSD-src-e35ed20ee19b31cb47b121feb166a2d50c0e60fb.tar.gz
1) Make usleep() terminateable by alarm (or ualarm) as supposed
historically 2) Fix end of time loop condition: && -> ||
Diffstat (limited to 'lib/libc/gen/usleep.c')
-rw-r--r--lib/libc/gen/usleep.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/lib/libc/gen/usleep.c b/lib/libc/gen/usleep.c
index 4b7d3cc..c8e26cb 100644
--- a/lib/libc/gen/usleep.c
+++ b/lib/libc/gen/usleep.c
@@ -44,10 +44,12 @@ static char sccsid[] = "@(#)usleep.c 8.1 (Berkeley) 6/4/93";
#endif
#ifndef _THREAD_SAFE
+static int alarm_termination;
+
static void
sleephandler()
{
- return;
+ alarm_termination++;
}
#endif /* _THREAD_SAFE */
@@ -66,7 +68,7 @@ usleep(useconds)
do {
nanosleep(&time_to_sleep, &time_remaining);
time_to_sleep = time_remaining;
- } while (time_to_sleep.tv_sec != 0 &&
+ } while (time_to_sleep.tv_sec != 0 ||
time_to_sleep.tv_nsec != 0);
}
#else
@@ -92,6 +94,7 @@ usleep(useconds)
sigaction(SIGALRM, &act, &oact);
mask = omask;
sigdelset(&mask, SIGALRM);
+ alarm_termination = 0;
/*
* signanosleep() uses the given mask for the lifetime of
@@ -102,8 +105,9 @@ usleep(useconds)
do {
signanosleep(&time_to_sleep, &time_remaining, &mask);
time_to_sleep = time_remaining;
- } while (time_to_sleep.tv_sec != 0 &&
- time_to_sleep.tv_nsec != 0);
+ } while (!alarm_termination &&
+ (time_to_sleep.tv_sec != 0 ||
+ time_to_sleep.tv_nsec != 0));
/* Unwind */
sigaction(SIGALRM, &oact, (struct sigaction *)0);
OpenPOWER on IntegriCloud