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