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