diff options
author | ache <ache@FreeBSD.org> | 1997-08-12 17:17:53 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1997-08-12 17:17:53 +0000 |
commit | e35ed20ee19b31cb47b121feb166a2d50c0e60fb (patch) | |
tree | 2de5efd41ef12fa95b3ffb7915c122d68ef5faec /lib/libc/gen/usleep.c | |
parent | 9fc764805ce0599c315781815fc0a3311fa00cb0 (diff) | |
download | FreeBSD-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.c | 12 |
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); |