shithub: riscv

Download patch

ref: 92b550d665b3d6042f3a31241649d2142f6b8f91
parent: f6833ce42841f25799ecbde8b847b30bfe6241a6
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;
--