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