summaryrefslogtreecommitdiffstats
path: root/lib/libc/gen/sleep.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/gen/sleep.c')
-rw-r--r--lib/libc/gen/sleep.c79
1 files changed, 9 insertions, 70 deletions
diff --git a/lib/libc/gen/sleep.c b/lib/libc/gen/sleep.c
index b3dd8b7..87aeb36 100644
--- a/lib/libc/gen/sleep.c
+++ b/lib/libc/gen/sleep.c
@@ -38,80 +38,19 @@ static char sccsid[] = "@(#)sleep.c 8.1 (Berkeley) 6/4/93";
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
-#ifdef _THREAD_SAFE
-#include <pthread.h>
-#include "pthread_private.h"
-#else
-
-#define setvec(vec, a) \
- vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0
-
-static int ringring;
-#endif
unsigned int
sleep(seconds)
unsigned int seconds;
{
-#ifdef _THREAD_SAFE
- struct timespec time_to_sleep;
- struct timespec time_remaining;
-
- if (seconds) {
- time_to_sleep.tv_sec = seconds;
- time_to_sleep.tv_nsec = 0;
- nanosleep(&time_to_sleep,&time_remaining);
- seconds = time_remaining.tv_sec;
- }
- 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;
- }
+ struct timespec time_to_sleep;
+ struct timespec time_remaining;
+
+ if (seconds != 0) {
+ time_to_sleep.tv_sec = seconds;
+ time_to_sleep.tv_nsec = 0;
+ nanosleep(&time_to_sleep, &time_remaining);
+ seconds = time_remaining.tv_sec;
}
- 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
-}
-
-#ifndef _THREAD_SAFE
-static void
-sleephandler()
-{
- ringring = 1;
+ return (seconds);
}
-#endif
OpenPOWER on IntegriCloud