summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-05-21 19:31:41 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-05-21 19:31:41 +0200
commit92b550d665b3d6042f3a31241649d2142f6b8f91 (patch)
treee13a2936faca98c13f9cc5d006dba2c4099b2898
parentf6833ce42841f25799ecbde8b847b30bfe6241a6 (diff)
kernel: prevent alarm(2) from returning instantly when the tick timer wraps. (from erik quanstros alarmwrap patch)
-rw-r--r--sys/src/9/port/alarm.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/src/9/port/alarm.c b/sys/src/9/port/alarm.c
index ea4d4e653..fb607523b 100644
--- a/sys/src/9/port/alarm.c
+++ b/sys/src/9/port/alarm.c
@@ -16,7 +16,7 @@ alarmkproc(void*)
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 @@ checkalarms(void)
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 @@ procalarm(ulong time)
return old;
}
when = ms2tk(time)+MACHP(0)->ticks;
+ if(when == 0)
+ when = 1;
qlock(&alarms);
l = &alarms.head;
@@ -82,7 +84,7 @@ procalarm(ulong time)
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;