Module Name:    src
Committed By:   pooka
Date:           Sun Dec 20 13:49:36 UTC 2009

Modified Files:
        src/sys/rump/librump/rumpkern: ltsleep.c

Log Message:
pthread_cond_timedwait (and therefore rumpuser_cv_timedwait) wants
an absolute time instead of a delta.  Fix bug which caused timed
tsleeps to always wake up immediately (unless the system clock was
around "0", which was not very probable ;).


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/rump/librump/rumpkern/ltsleep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/rump/librump/rumpkern/ltsleep.c
diff -u src/sys/rump/librump/rumpkern/ltsleep.c:1.23 src/sys/rump/librump/rumpkern/ltsleep.c:1.24
--- src/sys/rump/librump/rumpkern/ltsleep.c:1.23	Sat Dec  5 22:44:08 2009
+++ src/sys/rump/librump/rumpkern/ltsleep.c	Sun Dec 20 13:49:36 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: ltsleep.c,v 1.23 2009/12/05 22:44:08 pooka Exp $	*/
+/*	$NetBSD: ltsleep.c,v 1.24 2009/12/20 13:49:36 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ltsleep.c,v 1.23 2009/12/05 22:44:08 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ltsleep.c,v 1.24 2009/12/20 13:49:36 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -58,6 +58,7 @@
 static int
 sleeper(struct ltsleeper *ltsp, int timo)
 {
+	struct timespec ts, ticks;
 	int rv, nlocks;
 
 	LIST_INSERT_HEAD(&sleepers, ltsp, entries);
@@ -65,8 +66,12 @@
 
 	/* protected by biglock */
 	if (timo) {
+		ticks.tv_sec = timo / hz;
+		ticks.tv_nsec = (timo % hz) * (1000000000/hz);
+		nanotime(&ts);
+		timespecadd(&ts, &ticks, &ts);
 		if (rumpuser_cv_timedwait(ltsp->cv, rump_giantlock,
-		    timo / hz, (timo % hz) * (1000000000/hz)) == 0)
+		    ts.tv_sec, ts.tv_nsec) == 0)
 			rv = 0;
 		else
 			rv = EWOULDBLOCK;

Reply via email to