Module Name: src
Committed By: ad
Date: Thu Oct 12 23:51:06 UTC 2023
Modified Files:
src/sys/kern: kern_condvar.c
Log Message:
Comments.
To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/kern/kern_condvar.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/kern/kern_condvar.c
diff -u src/sys/kern/kern_condvar.c:1.58 src/sys/kern/kern_condvar.c:1.59
--- src/sys/kern/kern_condvar.c:1.58 Sun Oct 8 13:23:05 2023
+++ src/sys/kern/kern_condvar.c Thu Oct 12 23:51:05 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_condvar.c,v 1.58 2023/10/08 13:23:05 ad Exp $ */
+/* $NetBSD: kern_condvar.c,v 1.59 2023/10/12 23:51:05 ad Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008, 2019, 2020, 2023
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.58 2023/10/08 13:23:05 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_condvar.c,v 1.59 2023/10/12 23:51:05 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -451,8 +451,9 @@ cv_timedwaitbt_sig(kcondvar_t *cv, kmute
/*
* cv_signal:
*
- * Wake the highest priority LWP waiting on a condition variable.
- * Must be called with the interlocking mutex held.
+ * Wake the highest priority LWP waiting on a condition variable. Must
+ * be called with the interlocking mutex held or just after it has been
+ * released (so the awoken LWP will see the changed condition).
*/
void
cv_signal(kcondvar_t *cv)
@@ -460,8 +461,13 @@ cv_signal(kcondvar_t *cv)
KASSERT(cv_is_valid(cv));
- if (__predict_false(!LIST_EMPTY(CV_SLEEPQ(cv))))
+ if (__predict_false(!LIST_EMPTY(CV_SLEEPQ(cv)))) {
+ /*
+ * Compiler turns into a tail call usually, i.e. jmp,
+ * because the arguments are the same and no locals.
+ */
cv_wakeup_one(cv);
+ }
}
/*
@@ -492,8 +498,9 @@ cv_wakeup_one(kcondvar_t *cv)
/*
* cv_broadcast:
*
- * Wake all LWPs waiting on a condition variable. Must be called
- * with the interlocking mutex held.
+ * Wake all LWPs waiting on a condition variable. Must be called with
+ * the interlocking mutex held or just after it has been released (so
+ * the awoken LWP will see the changed condition).
*/
void
cv_broadcast(kcondvar_t *cv)
@@ -501,8 +508,13 @@ cv_broadcast(kcondvar_t *cv)
KASSERT(cv_is_valid(cv));
- if (__predict_false(!LIST_EMPTY(CV_SLEEPQ(cv))))
+ if (__predict_false(!LIST_EMPTY(CV_SLEEPQ(cv)))) {
+ /*
+ * Compiler turns into a tail call usually, i.e. jmp,
+ * because the arguments are the same and no locals.
+ */
cv_wakeup_all(cv);
+ }
}
/*