Module Name:    src
Committed By:   riastradh
Date:           Sun Nov 12 20:04:28 UTC 2017

Modified Files:
        src/share/man/man9: condvar.9

Log Message:
Rework cv_timedwaitbt documentation and example code.


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 src/share/man/man9/condvar.9

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

Modified files:

Index: src/share/man/man9/condvar.9
diff -u src/share/man/man9/condvar.9:1.16 src/share/man/man9/condvar.9:1.17
--- src/share/man/man9/condvar.9:1.16	Mon Jul  3 21:28:48 2017
+++ src/share/man/man9/condvar.9	Sun Nov 12 20:04:28 2017
@@ -1,4 +1,4 @@
-.\"	$NetBSD: condvar.9,v 1.16 2017/07/03 21:28:48 wiz Exp $
+.\"	$NetBSD: condvar.9,v 1.17 2017/11/12 20:04:28 riastradh Exp $
 .\"
 .\" Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -207,15 +207,24 @@ Similar to
 .Fn cv_timedwait
 and
 .Fn cv_timedwait_sig ,
-however the
-.Fa bintime
-argument is decremented in place with the amount of time actually waited,
-and on return contains the amount of time remaining.
+but
+.Fa bt
+is decremented in place with the amount of time actually waited, and on
+return contains the amount of time remaining, possibly negative if the
+timeout expired.
 .Pp
-The
+The hint
 .Fa epsilon
-argument is currently reserved for future use in choosing between low
-and high-resolution timers.
+requests that the wakeup not be delayed more than
+.Fa bt Li "+" Fa epsilon ,
+so that the system can coalesce multiple wakeups within their
+respective epsilons into a single high-resolution clock interrupt or
+choose to use cheaper low-resolution clock interrupts instead.
+.Pp
+However, the system is still limited by its best clock interrupt
+resolution and by scheduling competition, which may delay the wakeup by
+more than
+.Fa bt Li "+" Fa epsilon .
 .It Fn cv_signal "cv"
 .Pp
 Awaken one LWP (potentially among many) that is waiting on the specified
@@ -268,15 +277,18 @@ Consuming a resource:
 	 * five seconds.  If the resource is not available within the
 	 * alloted time, return an error.
 	 */
-	bt.sec = 5;
-	bt.frac = 0;
-	while (res->state == BUSY && (bt.sec || bt.frac))
-		cv_timedwaitbt(&res->condvar, \\
-		    &res->mutex, bt, epsilon);
-
-	if (res->state == BUSY) {
-		mutex_exit(&res->mutex);
-		return ETIMEDOUT;
+	struct bintime timeout = { .sec = 5, .frac = 0 };
+	const struct bintime epsilon = { .sec = 1, .frac = 0 };
+	while (res->state == BUSY) {
+		error = cv_timedwaitbt(&res->condvar, \\
+		    &res->mutex, &timeout, &epsilon);
+		if (error) {
+			KASSERT(error == EWOULDBLOCK);
+			if (res->state != BUSY)
+				break;
+			mutex_exit(&res->mutex);
+			return ETIMEDOUT;
+		}
 	}
 
 	/*

Reply via email to