diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-09-25 14:48:42 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-09-25 14:48:42 +0000 |
commit | 6fb883b02c6fca762dcbe31450c868e4b854952c (patch) | |
tree | 1749dbbe1ac1a00635fa9e508fa16d0829ba2e9d /sys/src/9/port/alarm.c | |
parent | 6abe569ec8f47ba14c3dcd5d5214e7b7a020bf7a (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.c | 150 |
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; } |