]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/alarm.c
devproc: return process id when reading /proc/n/ctl file
[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, when;
15
16         while(waserror())
17                 ;
18
19         for(;;){
20                 now = MACHP(0)->ticks;
21                 qlock(&alarms);
22                 for(rp = alarms.head; rp != nil; rp = rp->palarm){
23                         if((when = rp->alarm) == 0)
24                                 continue;
25                         if((long)(now - when) < 0)
26                                 break;
27                         if(!canqlock(&rp->debug))
28                                 break;
29                         if(rp->alarm != 0){
30                                 postnote(rp, 0, "alarm", NUser);
31                                 rp->alarm = 0;
32                         }
33                         qunlock(&rp->debug);
34                 }
35                 alarms.head = rp;
36                 qunlock(&alarms);
37
38                 sleep(&alarmr, return0, 0);
39         }
40 }
41
42 /*
43  *  called every clock tick on cpu0
44  */
45 void
46 checkalarms(void)
47 {
48         Proc *p;
49         ulong now, when;
50
51         p = alarms.head;
52         if(p != nil){
53                 now = MACHP(0)->ticks;
54                 when = p->alarm;
55                 if(when == 0 || (long)(now - when) >= 0)
56                         wakeup(&alarmr);
57         }
58 }
59
60 ulong
61 procalarm(ulong time)
62 {
63         Proc **l, *f;
64         ulong when, old;
65
66         when = MACHP(0)->ticks;
67         old = up->alarm;
68         if(old) {
69                 old -= when;
70                 if((long)old > 0)
71                         old = tk2ms(old);
72                 else
73                         old = 0;
74         }
75         if(time == 0) {
76                 up->alarm = 0;
77                 return old;
78         }
79         when += ms2tk(time);
80         if(when == 0)
81                 when = 1;
82
83         qlock(&alarms);
84         l = &alarms.head;
85         for(f = *l; f; f = f->palarm) {
86                 if(up == f){
87                         *l = f->palarm;
88                         break;
89                 }
90                 l = &f->palarm;
91         }
92         l = &alarms.head;
93         for(f = *l; f; f = f->palarm) {
94                 time = f->alarm;
95                 if(time != 0 && (long)(time - when) >= 0)
96                         break;
97                 l = &f->palarm;
98         }
99         up->palarm = f;
100         *l = up;
101         up->alarm = when;
102         qunlock(&alarms);
103
104         return old;
105 }