diff options
author | davidxu <davidxu@FreeBSD.org> | 2006-03-25 05:14:21 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2006-03-25 05:14:21 +0000 |
commit | 679e2338c09d03cb422a66ef721902bd8db95572 (patch) | |
tree | a34c318bb87016217575e4d8869cecb61d2b0020 /lib | |
parent | cba4d932c1656c6113f5b74aa79b7cb4d6945e22 (diff) | |
download | FreeBSD-src-679e2338c09d03cb422a66ef721902bd8db95572.zip FreeBSD-src-679e2338c09d03cb422a66ef721902bd8db95572.tar.gz |
Only wake up writer if the lock is free.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libthr/thread/thr_rtld.c | 4 |
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) { |