another cond var fix: requeue count race condition
authorRich Felker <dalias@aerifal.cx>
Mon, 26 Sep 2011 17:14:41 +0000 (13:14 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 26 Sep 2011 17:14:41 +0000 (13:14 -0400)
commit3bec53e0d3bb5e74d2e2dca34f50aadfaf832607
tree0ecc760d1a47571f61869bc43b243b4c4a2fdcab
parent1fa05210100caefc8546746e08358d81739f4b41
another cond var fix: requeue count race condition

lock out new waiters during the broadcast. otherwise the wait count
added to the mutex might be lower than the actual number of waiters
moved, and wakeups may be lost.

this issue could also be solved by temporarily setting the mutex
waiter count higher than any possible real count, then relying on the
kernel to tell us how many waiters were requeued, and updating the
counts afterwards. however the logic is more complex, and i don't
really trust the kernel. the solution here is also nice in that it
replaces some atomic cas loops with simple non-atomic ops under lock.
src/thread/pthread_cond_broadcast.c
src/thread/pthread_cond_timedwait.c