V9/libc/gen/sleep.c
#include <signal.h>
#include <setjmp.h>
static jmp_buf jmp;
sleep(n)
unsigned n;
{
int sleepx();
unsigned altime;
unsigned sltime;
int (*alsig)() = SIG_DFL;
if (n==0)
return;
altime = alarm(1000); /* time to maneuver */
if (setjmp(jmp)) {
signal(SIGALRM, alsig);
if (sltime) {
kill(getpid(), SIGALRM);
sleep(sltime);
return;
}
alarm(altime);
return;
}
sltime = 0;
if (altime) {
if (altime < n) {
sltime = n - altime;
n -= altime;
} else {
altime -= n;
if (altime == 0)
altime = 1;
}
}
alsig = signal(SIGALRM, sleepx);
alarm(n);
for(;;)
pause();
/*NOTREACHED*/
}
static
sleepx()
{
longjmp(jmp, 1);
}