diff options
author | peter <peter@FreeBSD.org> | 1997-06-02 16:30:22 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1997-06-02 16:30:22 +0000 |
commit | be1ae320cca2719e9782e0fae696f4e65b0e1c06 (patch) | |
tree | 844be508753f4735cb798208cf2dbb8b58754f4d /lib | |
parent | 800e70338e229a63144a55975918f2573ee594e9 (diff) | |
download | FreeBSD-src-be1ae320cca2719e9782e0fae696f4e65b0e1c06.zip FreeBSD-src-be1ae320cca2719e9782e0fae696f4e65b0e1c06.tar.gz |
Re-activate the nanosleep style using code, but with the signal handling
semantics of the old sleep for compatability with a few decades of expected
side effects. Apache breaks if we just use nanosleep() for some reason,
here we use a new signanosleep() syscall which is kinda like a hybrid of
sigsuspend and nanosleep..
Reviewed by: ache (and tested on his apache that was failing when
sleep used plain nanosleep)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/gen/sleep.c | 54 | ||||
-rw-r--r-- | lib/libc/gen/usleep.c | 58 |
2 files changed, 2 insertions, 110 deletions
diff --git a/lib/libc/gen/sleep.c b/lib/libc/gen/sleep.c index 6a9800d..49f2d89 100644 --- a/lib/libc/gen/sleep.c +++ b/lib/libc/gen/sleep.c @@ -44,19 +44,10 @@ static char sccsid[] = "@(#)sleep.c 8.1 (Berkeley) 6/4/93"; #endif #ifndef _THREAD_SAFE -#ifndef USE_NANOSLEEP -#define setvec(vec, a) \ - vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0 - -static int ringring; -#endif - static void sleephandler() { -#ifndef USE_NANOSLEEP - ringring = 1; -#endif + return; } #endif /* _THREAD_SAFE */ @@ -78,7 +69,6 @@ sleep(seconds) } return (seconds); #else -#if defined(USE_NANOSLEEP) struct timespec time_to_sleep; struct timespec time_remaining; struct sigaction act, oact; @@ -129,47 +119,5 @@ sleep(seconds) seconds++; /* round up */ } return (seconds); -#else - register struct itimerval *itp; - struct itimerval itv, oitv; - struct sigvec vec, ovec; - long omask; - static void sleephandler(); - - itp = &itv; - if (!seconds) - return 0; - timerclear(&itp->it_interval); - timerclear(&itp->it_value); - if (setitimer(ITIMER_REAL, itp, &oitv) < 0) - return seconds; - itp->it_value.tv_sec = seconds; - if (timerisset(&oitv.it_value)) { - if (timercmp(&oitv.it_value, &itp->it_value, >)) - oitv.it_value.tv_sec -= itp->it_value.tv_sec; - else { - itp->it_value = oitv.it_value; - /* - * This is a hack, but we must have time to return - * from the setitimer after the alarm or else it'll - * be restarted. And, anyway, sleep never did - * anything more than this before. - */ - oitv.it_value.tv_sec = 1; - oitv.it_value.tv_usec = 0; - } - } - setvec(vec, sleephandler); - (void) sigvec(SIGALRM, &vec, &ovec); - omask = sigblock(sigmask(SIGALRM)); - ringring = 0; - (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0); - while (!ringring) - sigpause(omask &~ sigmask(SIGALRM)); - (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0); - (void) sigsetmask(omask); - (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); - return 0; -#endif /* USE_NANOSLEEP */ #endif /* _THREAD_SAFE */ } diff --git a/lib/libc/gen/usleep.c b/lib/libc/gen/usleep.c index fa04989..4bcb7e9 100644 --- a/lib/libc/gen/usleep.c +++ b/lib/libc/gen/usleep.c @@ -43,25 +43,11 @@ static char sccsid[] = "@(#)usleep.c 8.1 (Berkeley) 6/4/93"; #include "pthread_private.h" #endif -#if !defined(_THREAD_SAFE) && !defined(USE_NANOSLEEP) -#define TICK 10000 /* system clock resolution in microseconds */ -#define USPS 1000000 /* number of microseconds in a second */ -#endif - #ifndef _THREAD_SAFE -#ifndef USE_NANOSLEEP -#define setvec(vec, a) \ - vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0 - -static int ringring; -#endif - static void sleephandler() { -#ifndef USE_NANOSLEEP - ringring = 1; -#endif + return; } #endif /* _THREAD_SAFE */ @@ -84,7 +70,6 @@ usleep(useconds) time_to_sleep.tv_nsec != 0); } #else -#ifdef USE_NANOSLEEP struct timespec time_to_sleep; struct timespec time_remaining; struct sigaction act, oact; @@ -134,46 +119,5 @@ usleep(useconds) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0); } } -#else - register struct itimerval *itp; - struct itimerval itv, oitv; - struct sigvec vec, ovec; - long omask; - static void sleephandler(); - - itp = &itv; - if (!useconds) - return; - timerclear(&itp->it_interval); - timerclear(&itp->it_value); - if (setitimer(ITIMER_REAL, itp, &oitv) < 0) - return; - itp->it_value.tv_sec = useconds / USPS; - itp->it_value.tv_usec = useconds % USPS; - if (timerisset(&oitv.it_value)) { - if (timercmp(&oitv.it_value, &itp->it_value, >)) { - oitv.it_value.tv_sec -= itp->it_value.tv_sec; - oitv.it_value.tv_usec -= itp->it_value.tv_usec; - if (oitv.it_value.tv_usec < 0) { - oitv.it_value.tv_usec += USPS; - oitv.it_value.tv_sec--; - } - } else { - itp->it_value = oitv.it_value; - oitv.it_value.tv_sec = 0; - oitv.it_value.tv_usec = 2 * TICK; - } - } - setvec(vec, sleephandler); - (void) sigvec(SIGALRM, &vec, &ovec); - omask = sigblock(sigmask(SIGALRM)); - ringring = 0; - (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0); - while (!ringring) - sigpause(omask &~ sigmask(SIGALRM)); - (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0); - (void) sigsetmask(omask); - (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); -#endif /* USE_NANOSLEEP */ #endif /* _THREAD_SAFE */ } |