]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/alarm.c
devshr, devaudio: openmode()/devopen() error handling
[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) && (long)(now - rp->alarm) >= 0){
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 on cpu0
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 != nil && (long)(now - p->alarm) >= 0)
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         if(when == 0)
71                 when = 1;
72
73         qlock(&alarms);
74         l = &alarms.head;
75         for(f = *l; f; f = f->palarm) {
76                 if(up == f){
77                         *l = f->palarm;
78                         break;
79                 }
80                 l = &f->palarm;
81         }
82
83         up->palarm = 0;
84         if(alarms.head) {
85                 l = &alarms.head;
86                 for(f = *l; f; f = f->palarm) {
87                         if((long)(f->alarm - when) >= 0) {
88                                 up->palarm = f;
89                                 *l = up;
90                                 goto done;
91                         }
92                         l = &f->palarm;
93                 }
94                 *l = up;
95         }
96         else
97                 alarms.head = up;
98 done:
99         up->alarm = when;
100         qunlock(&alarms);
101
102         return old;
103 }