]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/alarm.c
fix utf and rune handling in preparation for 32bit runes
[plan9front.git] / sys / src / 9 / port / alarm.c
1 #include        "u.h"
2 #include        "../port/lib.h"
3 #include        "mem.h"
4 #include        "dat.h"
5 #include        "fns.h"
6
7 static Alarms   alarms;
8 static Rendez   alarmr;
9
10 void
11 alarmkproc(void*)
12 {
13         Proc *rp;
14         ulong now;
15
16         for(;;){
17                 now = MACHP(0)->ticks;
18                 qlock(&alarms);
19                 while((rp = alarms.head) && rp->alarm <= now){
20                         if(rp->alarm != 0L){
21                                 if(canqlock(&rp->debug)){
22                                         if(!waserror()){
23                                                 postnote(rp, 0, "alarm", NUser);
24                                                 poperror();
25                                         }
26                                         qunlock(&rp->debug);
27                                         rp->alarm = 0L;
28                                 }else
29                                         break;
30                         }
31                         alarms.head = rp->palarm;
32                 }
33                 qunlock(&alarms);
34
35                 sleep(&alarmr, return0, 0);
36         }
37 }
38
39 /*
40  *  called every clock tick
41  */
42 void
43 checkalarms(void)
44 {
45         Proc *p;
46         ulong now;
47
48         p = alarms.head;
49         now = MACHP(0)->ticks;
50
51         if(p && p->alarm <= now)
52                 wakeup(&alarmr);
53 }
54
55 ulong
56 procalarm(ulong time)
57 {
58         Proc **l, *f;
59         ulong when, old;
60
61         if(up->alarm)
62                 old = tk2ms(up->alarm - MACHP(0)->ticks);
63         else
64                 old = 0;
65         if(time == 0) {
66                 up->alarm = 0;
67                 return old;
68         }
69         when = ms2tk(time)+MACHP(0)->ticks;
70
71         qlock(&alarms);
72         l = &alarms.head;
73         for(f = *l; f; f = f->palarm) {
74                 if(up == f){
75                         *l = f->palarm;
76                         break;
77                 }
78                 l = &f->palarm;
79         }
80
81         up->palarm = 0;
82         if(alarms.head) {
83                 l = &alarms.head;
84                 for(f = *l; f; f = f->palarm) {
85                         if(f->alarm > when) {
86                                 up->palarm = f;
87                                 *l = up;
88                                 goto done;
89                         }
90                         l = &f->palarm;
91                 }
92                 *l = up;
93         }
94         else
95                 alarms.head = up;
96 done:
97         up->alarm = when;
98         qunlock(&alarms);
99
100         return old;
101 }