summaryrefslogtreecommitdiffstats
path: root/lib/libthr
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2006-03-25 05:14:21 +0000
committerdavidxu <davidxu@FreeBSD.org>2006-03-25 05:14:21 +0000
commit679e2338c09d03cb422a66ef721902bd8db95572 (patch)
treea34c318bb87016217575e4d8869cecb61d2b0020 /lib/libthr
parentcba4d932c1656c6113f5b74aa79b7cb4d6945e22 (diff)
downloadFreeBSD-src-679e2338c09d03cb422a66ef721902bd8db95572.zip
FreeBSD-src-679e2338c09d03cb422a66ef721902bd8db95572.tar.gz
Only wake up writer if the lock is free.
Diffstat (limited to 'lib/libthr')
-rw-r--r--lib/libthr/thread/thr_rtld.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/libthr/thread/thr_rtld.c b/lib/libthr/thread/thr_rtld.c
index b1ba384..7dbd910 100644
--- a/lib/libthr/thread/thr_rtld.c
+++ b/lib/libthr/thread/thr_rtld.c
@@ -146,14 +146,14 @@ _thr_rtld_lock_release(void *lock)
if ((l->lock & WAFLAG) == 0) {
atomic_add_rel_int(&l->lock, -RC_INCR);
- if (l->wr_waiters) {
+ if (l->lock == 0 && l->wr_waiters) {
atomic_add_long(&l->wr_cv, 1);
_thr_umtx_wake(&l->wr_cv, l->wr_waiters);
}
THR_CRITICAL_LEAVE(curthread);
} else {
atomic_add_rel_int(&l->lock, -WAFLAG);
- if (l->wr_waiters) {
+ if (l->lock == 0 && l->wr_waiters) {
atomic_add_long(&l->wr_cv, 1);
_thr_umtx_wake(&l->wr_cv, l->wr_waiters);
} else if (l->rd_waiters) {
OpenPOWER on IntegriCloud