summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/sleep.c
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1997-08-12 19:47:01 +0000
committerache <ache@FreeBSD.org>1997-08-12 19:47:01 +0000
commit3a0de699cffd5b7b8d5586f0e9adcba97e36be90 (patch)
treeee45075fbda6f8a914b272c4b4547025f1e73a2f /lib/libc/gen/sleep.c
parentb4d5f4ee839779a4005fd6ce4d69987b5b616dca (diff)
downloadFreeBSD-src-3a0de699cffd5b7b8d5586f0e9adcba97e36be90.zip
FreeBSD-src-3a0de699cffd5b7b8d5586f0e9adcba97e36be90.tar.gz
Solve itimerfix() problem completely by using loop in 100000000 secs chunks
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 b553bf7..d142a83 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)
OpenPOWER on IntegriCloud