diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/9/port/alarm.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/9/port/alarm.c')
-rwxr-xr-x | sys/src/9/port/alarm.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/sys/src/9/port/alarm.c b/sys/src/9/port/alarm.c new file mode 100755 index 000000000..ea4d4e653 --- /dev/null +++ b/sys/src/9/port/alarm.c @@ -0,0 +1,101 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" + +static Alarms alarms; +static Rendez alarmr; + +void +alarmkproc(void*) +{ + Proc *rp; + ulong now; + + for(;;){ + now = MACHP(0)->ticks; + qlock(&alarms); + while((rp = alarms.head) && rp->alarm <= now){ + if(rp->alarm != 0L){ + if(canqlock(&rp->debug)){ + if(!waserror()){ + postnote(rp, 0, "alarm", NUser); + poperror(); + } + qunlock(&rp->debug); + rp->alarm = 0L; + }else + break; + } + alarms.head = rp->palarm; + } + qunlock(&alarms); + + sleep(&alarmr, return0, 0); + } +} + +/* + * called every clock tick + */ +void +checkalarms(void) +{ + Proc *p; + ulong now; + + p = alarms.head; + now = MACHP(0)->ticks; + + if(p && p->alarm <= now) + wakeup(&alarmr); +} + +ulong +procalarm(ulong time) +{ + Proc **l, *f; + ulong when, old; + + if(up->alarm) + old = tk2ms(up->alarm - MACHP(0)->ticks); + else + old = 0; + if(time == 0) { + up->alarm = 0; + return old; + } + when = ms2tk(time)+MACHP(0)->ticks; + + qlock(&alarms); + l = &alarms.head; + for(f = *l; f; f = f->palarm) { + if(up == f){ + *l = f->palarm; + break; + } + l = &f->palarm; + } + + up->palarm = 0; + if(alarms.head) { + l = &alarms.head; + for(f = *l; f; f = f->palarm) { + if(f->alarm > when) { + up->palarm = f; + *l = up; + goto done; + } + l = &f->palarm; + } + *l = up; + } + else + alarms.head = up; +done: + up->alarm = when; + qunlock(&alarms); + + return old; +} |