|
|
1.1 root 1: /*
2: * Sleep -- suspent execution for interval
3: * See that alarms previously
4: * and intermediately set are properly handled.
5: */
6:
7: #include "signal.h"
8:
9: extern int func(); /* Allow pause to return */
10:
11: sleep(sec)
12: register unsigned sec;
13: {
14: register unsigned osec;
15: int (*ofunc)();
16:
17: for (;;) {
18: ofunc = signal(SIGALRM, func);
19: osec = alarm(sec);
20: if (sec == 0) {
21: break;
22: } else if (osec == 0) { /* No current alarm */
23: func(0);
24: break;
25: } else if (osec < sec) { /* Current alarm precedes us */
26: alarm(osec);
27: func(0);
28: (*ofunc)();
29: sec -= osec;
30: continue;
31: } else if (osec == sec) { /* Contemporaneous */
32: func(0);
33: (*ofunc)();
34: sec -= osec;
35: continue;
36: } else if (osec > sec) { /* Current alarm follows us */
37: osec -= sec;
38: func(0);
39: break;
40: }
41: }
42: signal(SIGALRM, ofunc);
43: alarm(osec);
44: }
45:
46: /*
47: * Called to wait for SIGALRM,
48: * and to catch SIGALRM thus waking up the pause half.
49: */
50: static
51: func(n)
52: int n;
53: {
54: static int done;
55:
56: if (n == 0) {
57: done = 0;
58: do pause(); while (done == 0);
59: } else {
60: ++done;
61: }
62: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.