summaryrefslogtreecommitdiff
path: root/sys/src/9/port/alarm.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-09-25 14:48:42 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-09-25 14:48:42 +0000
commit6fb883b02c6fca762dcbe31450c868e4b854952c (patch)
tree1749dbbe1ac1a00635fa9e508fa16d0829ba2e9d /sys/src/9/port/alarm.c
parent6abe569ec8f47ba14c3dcd5d5214e7b7a020bf7a (diff)
9/port: revert timer wheel change, breaks pi4 boot, needs more time investigating
Diffstat (limited to 'sys/src/9/port/alarm.c')
-rw-r--r--sys/src/9/port/alarm.c150
1 files changed, 84 insertions, 66 deletions
diff --git a/sys/src/9/port/alarm.c b/sys/src/9/port/alarm.c
index 95516222f..49dec2ccb 100644
--- a/sys/src/9/port/alarm.c
+++ b/sys/src/9/port/alarm.c
@@ -3,91 +3,109 @@
#include "mem.h"
#include "dat.h"
#include "fns.h"
-#include "error.h"
-static Proc *tripped;
+static Alarms alarms;
static Rendez alarmr;
-static Lock triplk;
-
-static int
-tfn(void *)
-{
- int t;
-
- ilock(&triplk);
- t = (tripped != nil);
- iunlock(&triplk);
- return t;
-}
-
-/*
- * called every clock tick on cpu0
- */
-static void
-tripalarm(Ureg*, Timer *t)
-{
- ilock(&triplk);
- t->p->palarm = tripped;
- tripped = t->p;
- iunlock(&triplk);
-
- wakeup(&alarmr);
-}
void
alarmkproc(void*)
{
- static Note alarmnote = {
- "alarm",
- NUser,
- 1,
- };
- Proc *p, *n;
- Timer *a;
+ Proc *rp;
+ ulong now, when;
while(waserror())
;
- while(1){
- ilock(&triplk);
- p = tripped;
- tripped = nil;
- iunlock(&triplk);
-
- for(; p != nil; p = n){
- n = p->palarm;
- a = &p->alarm;
- if(!canqlock(&p->debug)){
- a->tns = MS2NS(10);
- timeradd(a);
+ for(;;){
+ now = MACHP(0)->ticks;
+ qlock(&alarms);
+ for(rp = alarms.head; rp != nil; rp = rp->palarm){
+ if((when = rp->alarm) == 0)
continue;
+ if((long)(now - when) < 0)
+ break;
+ if(!canqlock(&rp->debug))
+ break;
+ if(rp->alarm != 0){
+ static Note alarm = {
+ "alarm",
+ NUser,
+ 1,
+ };
+ incref(&alarm);
+ pushnote(rp, &alarm);
+ rp->alarm = 0;
}
- incref(&alarmnote);
- pushnote(p, &alarmnote);
- qunlock(&p->debug);
+ qunlock(&rp->debug);
}
- sleep(&alarmr, tfn, nil);
+ alarms.head = rp;
+ qunlock(&alarms);
+
+ sleep(&alarmr, return0, 0);
+ }
+}
+
+/*
+ * called every clock tick on cpu0
+ */
+void
+checkalarms(void)
+{
+ Proc *p;
+ ulong now, when;
+
+ p = alarms.head;
+ if(p != nil){
+ now = MACHP(0)->ticks;
+ when = p->alarm;
+ if(when == 0 || (long)(now - when) >= 0)
+ wakeup(&alarmr);
}
}
ulong
procalarm(ulong time)
{
- uvlong old;
- Timer *a;
+ Proc **l, *f;
+ ulong when, old;
+
+ when = MACHP(0)->ticks;
+ old = up->alarm;
+ if(old) {
+ old -= when;
+ if((long)old > 0)
+ old = tk2ms(old);
+ else
+ old = 0;
+ }
+ if(time == 0) {
+ up->alarm = 0;
+ return old;
+ }
+ when += ms2tk(time);
+ if(when == 0)
+ when = 1;
- a = &up->alarm;
- old = a->tns;
- timerdel(a);
+ qlock(&alarms);
+ l = &alarms.head;
+ for(f = *l; f; f = f->palarm) {
+ if(up == f){
+ *l = f->palarm;
+ break;
+ }
+ l = &f->palarm;
+ }
+ l = &alarms.head;
+ for(f = *l; f; f = f->palarm) {
+ time = f->alarm;
+ if(time != 0 && (long)(time - when) >= 0)
+ break;
+ l = &f->palarm;
+ }
+ up->palarm = f;
+ *l = up;
+ up->alarm = when;
+ qunlock(&alarms);
- lock(a);
- a->tns = MS2NS(time);
- a->tf = tripalarm;
- a->tmode = Trelative;
- a->p = up;
- a->ta = nil;
- unlock(a);
- if(time != 0)
- timeradd(a);
- return NS2MS(old);
+ return old;
}