fix failure-to-wake in rwlock unlock

a reader unlocking the lock need only wake one waiter (necessarily a
writer, but a writer unlocking the lock must wake all waiters
(necessarily readers). if it only wakes one, the remainder can remain
blocked indefinitely, or at least until the first reader unlocks (in
which case the whole lock becomes serialized and behaves as a mutex
rather than a read lock).
This commit is contained in:
Rich Felker 2011-10-01 09:11:35 -04:00
parent 8b98c09f8c
commit b85fec2ded
1 changed files with 1 additions and 1 deletions

View File

@ -12,7 +12,7 @@ int pthread_rwlock_unlock(pthread_rwlock_t *rw)
} while (a_cas(&rw->_rw_lock, val, new) != val);
if (!new && (waiters || val<0))
__wake(&rw->_rw_lock, 1, 0);
__wake(&rw->_rw_lock, cnt, 0);
return 0;
}