fix failure-to-wake in rwlock unlock
authorRich Felker <dalias@aerifal.cx>
Sat, 1 Oct 2011 13:11:35 +0000 (09:11 -0400)
committerRich Felker <dalias@aerifal.cx>
Sat, 1 Oct 2011 13:11:35 +0000 (09:11 -0400)
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).

src/thread/pthread_rwlock_unlock.c

index 5edca634b785c889db3edcbe31b42cc9ccf3abf0..a6d20854c8a5001b3d8739636619d4d76c73694b 100644 (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;
 }