|
|
1.1 root 1: #include "u.h"
2: #include "../port/lib.h"
3: #include "mem.h"
4: #include "dat.h"
5: #include "fns.h"
6: #include "io.h"
7:
8: Alarms alarms;
9: Rendez alarmr;
10: Talarm talarm;
11:
12: void
13: alarmkproc(void *arg)
14: {
15: Proc *rp;
16: ulong now;
17:
18: USED(arg);
19:
20: for(;;){
21: now = MACHP(0)->ticks;
22: qlock(&alarms);
23: while((rp = alarms.head) && rp->alarm <= now) {
24: if(rp->alarm != 0L) {
25: if(!canqlock(&rp->debug))
26: break;
27:
28: if(!waserror()) {
29: postnote(rp, 0, "alarm", NUser);
30: poperror();
31: }
32: qunlock(&rp->debug);
33: rp->alarm = 0L;
34: }
35: alarms.head = rp->palarm;
36: }
37: qunlock(&alarms);
38:
39: sleep(&alarmr, return0, 0);
40: }
41: }
42:
43: /*
44: * called every clock tick
45: */
46: void
47: checkalarms(void)
48: {
49: Proc *p;
50: ulong now;
51:
52: p = alarms.head;
53: now = MACHP(0)->ticks;
54:
55: if(p && p->alarm <= now)
56: wakeup(&alarmr);
57:
58: if(talarm.list == 0 || canlock(&talarm) == 0)
59: return;
60:
61: for(;;) {
62: p = talarm.list;
63: if(p == 0)
64: break;
65:
66: if(p->twhen == 0) {
67: talarm.list = p->tlink;
68: p->trend = 0;
69: continue;
70: }
71: if(now < p->twhen)
72: break;
73: wakeup(p->trend);
74: talarm.list = p->tlink;
75: p->trend = 0;
76: }
77:
78: unlock(&talarm);
79: }
80:
81: ulong
82: procalarm(ulong time)
83: {
84: Proc **l, *f, *p;
85: ulong when, old;
86:
87: p = u->p;
88: if(p->alarm)
89: old = TK2MS(p->alarm - MACHP(0)->ticks);
90: else
91: old = 0;
92: if(time == 0) {
93: p->alarm = 0;
94: return old;
95: }
96: when = MS2TK(time)+MACHP(0)->ticks;
97:
98: qlock(&alarms);
99: l = &alarms.head;
100: for(f = *l; f; f = f->palarm) {
101: if(p == f){
102: *l = f->palarm;
103: break;
104: }
105: l = &f->palarm;
106: }
107:
108: p->palarm = 0;
109: if(alarms.head) {
110: l = &alarms.head;
111: for(f = *l; f; f = f->palarm) {
112: if(f->alarm > when) {
113: p->palarm = f;
114: *l = p;
115: goto done;
116: }
117: l = &f->palarm;
118: }
119: *l = p;
120: }
121: else
122: alarms.head = p;
123: done:
124: p->alarm = when;
125: qunlock(&alarms);
126:
127: return old;
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.