summaryrefslogtreecommitdiff
path: root/lib/libc/gen/sleep.c
diff options
context:
space:
mode:
authorAndrey A. Chernov <ache@FreeBSD.org>1997-08-12 19:47:01 +0000
committerAndrey A. Chernov <ache@FreeBSD.org>1997-08-12 19:47:01 +0000
commitb39d66c04ae615a15974e620682b4abddb7b6661 (patch)
tree3cd945817b24b4c6a87945232a307adf11287113 /lib/libc/gen/sleep.c
parent6d4ff454277c574edb42127b5e7aad703f13930a (diff)
Notes
Diffstat (limited to 'lib/libc/gen/sleep.c')
-rw-r--r--lib/libc/gen/sleep.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/libc/gen/sleep.c b/lib/libc/gen/sleep.c
index b553bf747636..d142a83f1d28 100644
--- a/lib/libc/gen/sleep.c
+++ b/lib/libc/gen/sleep.c
@@ -63,6 +63,7 @@ sleep(seconds)
struct timespec time_remaining;
if (seconds != 0) {
+ again:
/*
* XXX
* Hack to work around itimerfix(9) gratuitously limiting
@@ -76,6 +77,15 @@ sleep(seconds)
time_to_sleep.tv_sec = seconds;
time_to_sleep.tv_nsec = 0;
nanosleep(&time_to_sleep, &time_remaining);
+
+ if (rest != 0 &&
+ time_remaining.tv_sec == 0 &&
+ time_remaining.tv_nsec == 0) {
+ seconds = rest;
+ rest = 0;
+ goto again;
+ }
+
rest += time_remaining.tv_sec;
if (time_remaining.tv_nsec > 0)
rest++; /* round up */
@@ -90,6 +100,7 @@ sleep(seconds)
int alarm_blocked;
if (seconds != 0) {
+ again:
/*
* XXX
* Hack to work around itimerfix(9) gratuitously limiting
@@ -137,6 +148,14 @@ sleep(seconds)
sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
}
+ if (rest != 0 &&
+ time_remaining.tv_sec == 0 &&
+ time_remaining.tv_nsec == 0) {
+ seconds = rest;
+ rest = 0;
+ goto again;
+ }
+
/* return how long is left */
rest += time_remaining.tv_sec;
if (time_remaining.tv_nsec > 0)