V9/libc/gen/sleep.c

Compare this file to the similar file:
Show the results in this format:

#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);
}