121360Sdist /* 221360Sdist * Copyright (c) 1980 Regents of the University of California. 321360Sdist * All rights reserved. The Berkeley software License Agreement 421360Sdist * specifies the terms and conditions for redistribution. 521360Sdist */ 621360Sdist 7*26593Sdonn #if defined(LIBC_SCCS) && !defined(lint) 8*26593Sdonn static char sccsid[] = "@(#)sleep.c 5.2 (Berkeley) 03/09/86"; 9*26593Sdonn #endif LIBC_SCCS and not lint 1012977Ssam 1113582Ssam #include <sys/time.h> 121979Swnj #include <signal.h> 131979Swnj 1412977Ssam #define setvec(vec, a) \ 1512977Ssam vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0 1612977Ssam 1714618Skarels static int ringring; 1814618Skarels 191979Swnj sleep(n) 2012977Ssam unsigned n; 211979Swnj { 2212977Ssam int sleepx(), omask; 2312977Ssam struct itimerval itv, oitv; 2412977Ssam register struct itimerval *itp = &itv; 2512977Ssam struct sigvec vec, ovec; 261979Swnj 2712977Ssam if (n == 0) 281979Swnj return; 2912977Ssam timerclear(&itp->it_interval); 3012977Ssam timerclear(&itp->it_value); 3112977Ssam if (setitimer(ITIMER_REAL, itp, &oitv) < 0) 3212977Ssam return; 3312977Ssam itp->it_value.tv_sec = n; 3412977Ssam if (timerisset(&oitv.it_value)) { 3512977Ssam if (timercmp(&oitv.it_value, &itp->it_value, >)) 3612977Ssam oitv.it_value.tv_sec -= itp->it_value.tv_sec; 371979Swnj else { 3812977Ssam itp->it_value = oitv.it_value; 3912977Ssam /* 4013019Ssam * This is a hack, but we must have time to 4114618Skarels * return from the setitimer after the alarm 4213019Ssam * or else it'll be restarted. And, anyway, 4313019Ssam * sleep never did anything more than this before. 4412977Ssam */ 4513019Ssam oitv.it_value.tv_sec = 1; 4613019Ssam oitv.it_value.tv_usec = 0; 471979Swnj } 481979Swnj } 4912977Ssam setvec(vec, sleepx); 5012977Ssam (void) sigvec(SIGALRM, &vec, &ovec); 5117491Skarels omask = sigblock(sigmask(SIGALRM)); 5214954Skarels ringring = 0; 5314618Skarels (void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0); 5414618Skarels while (!ringring) 5517491Skarels sigpause(omask &~ sigmask(SIGALRM)); 5614618Skarels (void) sigvec(SIGALRM, &ovec, (struct sigvec *)0); 5717491Skarels (void) sigsetmask(omask); 5814618Skarels (void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); 591979Swnj } 601979Swnj 611979Swnj static 621979Swnj sleepx() 631979Swnj { 6412977Ssam 6514618Skarels ringring = 1; 661979Swnj } 67