diff options
author | ache <ache@FreeBSD.org> | 1997-08-12 19:47:01 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1997-08-12 19:47:01 +0000 |
commit | 3a0de699cffd5b7b8d5586f0e9adcba97e36be90 (patch) | |
tree | ee45075fbda6f8a914b272c4b4547025f1e73a2f | |
parent | b4d5f4ee839779a4005fd6ce4d69987b5b616dca (diff) | |
download | FreeBSD-src-3a0de699cffd5b7b8d5586f0e9adcba97e36be90.zip FreeBSD-src-3a0de699cffd5b7b8d5586f0e9adcba97e36be90.tar.gz |
Solve itimerfix() problem completely by using loop in 100000000 secs chunks
-rw-r--r-- | lib/libc/gen/sleep.c | 19 |
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) |