xref: /csrg-svn/lib/libc/gen/sleep.c (revision 1979)
1*1979Swnj /* @(#)sleep.c	4.1 (Berkeley) 12/21/80 */
2*1979Swnj #include <signal.h>
3*1979Swnj #include <setjmp.h>
4*1979Swnj 
5*1979Swnj static jmp_buf jmp;
6*1979Swnj 
7*1979Swnj sleep(n)
8*1979Swnj unsigned n;
9*1979Swnj {
10*1979Swnj 	int sleepx();
11*1979Swnj 	unsigned altime;
12*1979Swnj 	int (*alsig)() = SIG_DFL;
13*1979Swnj 
14*1979Swnj 	if (n==0)
15*1979Swnj 		return;
16*1979Swnj 	altime = alarm(1000);	/* time to maneuver */
17*1979Swnj 	if (setjmp(jmp)) {
18*1979Swnj 		signal(SIGALRM, alsig);
19*1979Swnj 		alarm(altime);
20*1979Swnj 		return;
21*1979Swnj 	}
22*1979Swnj 	if (altime) {
23*1979Swnj 		if (altime > n)
24*1979Swnj 			altime -= n;
25*1979Swnj 		else {
26*1979Swnj 			n = altime;
27*1979Swnj 			altime = 1;
28*1979Swnj 		}
29*1979Swnj 	}
30*1979Swnj 	alsig = signal(SIGALRM, sleepx);
31*1979Swnj 	alarm(n);
32*1979Swnj 	for(;;)
33*1979Swnj 		pause();
34*1979Swnj 	/*NOTREACHED*/
35*1979Swnj }
36*1979Swnj 
37*1979Swnj static
38*1979Swnj sleepx()
39*1979Swnj {
40*1979Swnj 	longjmp(jmp, 1);
41*1979Swnj }
42