charles thoughts on alarm: - do not leave 0 with a special meaning in the alarm list, - do not leave stale pointers in the list a nix version should be forthcoming Reference: /n/atom/patch/applied/alarm-charles Date: Wed Jan 29 03:56:15 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/9/port/swap.c Wed Jan 29 03:54:48 2014 +++ /sys/src/9/port/swap.c Wed Jan 29 03:54:49 2014 @@ -439,9 +439,3 @@ swapimage.c = c; } - -int -swapfull(void) -{ - return swapalloc.free < conf.nswap/10; -} --- /sys/src/9/port/portfns.h Wed Jan 29 03:54:50 2014 +++ /sys/src/9/port/portfns.h Wed Jan 29 03:54:51 2014 @@ -303,9 +303,9 @@ int readnum(ulong, char*, ulong, ulong, int); int readstr(ulong, char*, ulong, char*); void ready(Proc*); -void* realloc(void *v, ulong size); +void* realloc(void*, usize); void rebootcmd(int, char**); -void reboot(void*, void*, ulong); +void reboot(void*, void*, usize); void relocateseg(Segment*, ulong); void renameuser(char*, char*); void resched(char*); @@ -339,8 +339,8 @@ void splxpc(int); char* srvname(Chan*); int swapcount(ulong); -int swapfull(void); void swapinit(void); +#define tickscmp(a, b) ((long)((a)-(b))) void timeradd(Timer*); void timerdel(Timer*); void timersinit(void); --- /sys/src/9/port/alarm.c Wed Jan 29 03:54:52 2014 +++ /sys/src/9/port/alarm.c Wed Jan 29 03:54:53 2014 @@ -10,25 +10,25 @@ void alarmkproc(void*) { - Proc *rp; + Proc *rp, **l; ulong now; for(;;){ now = MACHP(0)->ticks; qlock(&alarms); - for(rp = alarms.head; rp != nil; rp = rp->palarm){ - if(rp->alarm == 0) - continue; - if((long)(now - rp->alarm) < 0) - break; - if(canqlock(&rp->debug)) - break; - if(rp->alarm != 0) - postnote(rp, 0, "alarm", NUser); - rp->alarm = 0; - qunlock(&rp->debug); + l = &alarms.head; + while((rp = *l) != nil && tickscmp(now, rp->alarm) >= 0){ + if(canqlock(&rp->debug)){ + if(!waserror()){ + postnote(rp, 0, "alarm", NUser); + poperror(); + } + qunlock(&rp->debug); + rp->alarm = 0; + *l = rp->palarm; + }else + l = &rp->palarm; } - alarms.head = rp; qunlock(&alarms); sleep(&alarmr, return0, 0); @@ -42,25 +42,39 @@ checkalarms(void) { Proc *p; - ulong now; p = alarms.head; - now = MACHP(0)->ticks; - - if(p != nil) - if(p->alarm == 0 || (long)(now - p->alarm) >= 0) + if(p != nil && tickscmp(MACHP(0)->ticks, p->alarm) >= 0) wakeup(&alarmr); } +static void +disalarm(Proc *p) +{ + Proc **l, *f; + + qlock(&alarms); + for(l = &alarms.head; (f = *l) != nil; l = &f->palarm){ + if(f == p){ + *l = f->palarm; + f->palarm = nil; + break; + } + } + qunlock(&alarms); +} + ulong procalarm(ulong time) { Proc **l, *f; ulong when, old; - if(up->alarm) - old = tk2ms(up->alarm - MACHP(0)->ticks); - else + old = up->alarm; + if(up->alarm){ + disalarm(up); + old = tk2ms(old - MACHP(0)->ticks); + }else old = 0; if(time == 0) { up->alarm = 0; @@ -71,25 +85,12 @@ when = 1; qlock(&alarms); + up->alarm = when; l = &alarms.head; - for(f = *l; f; f = f->palarm) { - if(up == f){ - *l = f->palarm; - break; - } - l = &f->palarm; - } - up->palarm = 0; - l = &alarms.head; - for(f = *l; f != nil; f = f->palarm) { - time = f->alarm; - if(time != 0 && (long)(time - when) >= 0) - break; + while((f = *l) != nil && tickscmp(f->alarm, when) < 0) l = &f->palarm; - } - up->palarm = f; + up->palarm = *l; *l = up; - up->alarm = when; qunlock(&alarms); return old; --- /sys/src/9/port/proc.c Wed Jan 29 03:54:56 2014 +++ /sys/src/9/port/proc.c Wed Jan 29 03:54:57 2014 @@ -621,6 +621,7 @@ p->procctl = 0; p->syscalltrace = 0; p->notepending = 0; + p->nnote = 0; p->ureg = 0; p->privatemem = 0; p->noswap = 0; @@ -1047,8 +1048,9 @@ if(up->syscalltrace) free(up->syscalltrace); - up->alarm = 0; - if (up->tt) + if(up->alarm != 0) + procalarm(0); + if(up->tt) timerdel(up); pt = proctrace; if(pt) @@ -1346,7 +1348,11 @@ Proc *p; static Pgrp *kpgrp; + while(waserror()) + ; p = newproc(); + poperror(); + p->psstate = 0; p->procmode = 0640; p->kp = 1;