ref: f961d9581843682dfdd6aa8eca3b064b77381f7e
parent: a63c54212f17bfea27d04ca008ece63bd15b4f90
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue May 21 15:31:41 EDT 2013
kernel: prevent alarm(2) from returning instantly when the tick timer wraps. (from erik quanstros alarmwrap patch)
--- a/sys/src/9/port/alarm.c
+++ b/sys/src/9/port/alarm.c
@@ -16,7 +16,7 @@
for(;;){now = MACHP(0)->ticks;
qlock(&alarms);
- while((rp = alarms.head) && rp->alarm <= now){+ while((rp = alarms.head) && (long)(now - rp->alarm) >= 0){ if(rp->alarm != 0L){ if(canqlock(&rp->debug)){ if(!waserror()){@@ -48,7 +48,7 @@
p = alarms.head;
now = MACHP(0)->ticks;
- if(p && p->alarm <= now)
+ if(p != nil && (long)(now - p->alarm) >= 0)
wakeup(&alarmr);
}
@@ -67,6 +67,8 @@
return old;
}
when = ms2tk(time)+MACHP(0)->ticks;
+ if(when == 0)
+ when = 1;
qlock(&alarms);
l = &alarms.head;
@@ -82,7 +84,7 @@
if(alarms.head) {l = &alarms.head;
for(f = *l; f; f = f->palarm) {- if(f->alarm > when) {+ if((long)(f->alarm - when) >= 0) {up->palarm = f;
*l = up;
goto done;
--
⑨