10 Commits

Author SHA1 Message Date
Rich Felker
729d6368bd redo cond vars again, use sequence numbers
testing revealed that the old implementation, while correct, was
giving way too many spurious wakeups due to races changing the value
of the condition futex. in a test program with 5 threads receiving
broadcast signals, the number of returns from pthread_cond_wait was
roughly 3 times what it should have been (2 spurious wakeups for every
legitimate wakeup). moreover, the magnitude of this effect seems to
grow with the number of threads.

the old implementation may also have had some nasty race conditions
with reuse of the cond var with a new mutex.

the new implementation is based on incrementing a sequence number with
each signal event. this sequence number has nothing to do with the
number of threads intended to be woken; it's only used to provide a
value for the futex wait to avoid deadlock. in theory there is a
danger of race conditions due to the value wrapping around after 2^32
signals. it would be nice to eliminate that, if there's a way.

testing showed no spurious wakeups (though they are of course
possible) with the new implementation, as well as slightly improved
performance.
2011-09-26 00:25:13 -04:00
Rich Felker
c11d1e6967 revert previous change in cond var waiter move
using swap has a race condition: the waiters must be added to the
mutex waiter count *before* they are taken off the cond var waiter
count, or wake events can be lost.
2011-09-25 21:14:40 -04:00
Rich Felker
cf940165d4 optimize cond waiter move using atomic swap instead of cas loop 2011-09-25 21:10:50 -04:00
Rich Felker
09ec0f3aab fix logic for when wakeup is not desired on cond bcast
somehow i forgot that normal-type mutexes don't store the owner tid.
2011-09-25 02:56:01 -04:00
Rich Felker
cba4e1c0a3 new futex-requeue-based pthread_cond_broadcast implementation
this avoids the "stampede effect" where pthread_cond_broadcast would
result in all waiters waking up simultaneously, only to immediately
contend for the mutex and go back to sleep.
2011-09-25 02:38:03 -04:00
Rich Felker
97c5b5a87c fix ABA race in cond vars, improve them overall
previously, a waiter could miss the 1->0 transition of block if
another thread set block to 1 again after the signal function set
block to 0. we now use the caller's thread id as a unique token to
store in block, which no other thread will ever write there. this
ensures that if block still contains the tid, no signal has occurred.
spurious wakeups will of course occur whenever there is a spurious
return from the futex wait and another thread has begun waiting on the
cond var. this should be a rare occurrence except perhaps in the
presence of interrupting signal handlers.

signal/bcast operations have been improved by noting that they need
not avoid inspecting the cond var's memory after changing the futex
value. because the standard allows spurious wakeups, there is no way
for an application to distinguish between a spurious wakeup just
before another thread called signal/bcast, and the deliberate wakeup
resulting from the signal/bcast call. thus the woken thread must
assume that the signalling thread may still be waiting to act on the
cond var, and therefore it cannot destroy/unmap the cond var.
2011-09-23 22:58:45 -04:00
Rich Felker
4b153ac424 fix deadlock in condition wait whenever there are multiple waiters
it's amazing none of the conformance tests i've run even bothered to
check whether something so basic works...
2011-09-22 21:08:55 -04:00
Rich Felker
1407785824 condition variable signal/bcast need not wake unless there are waiters 2011-08-07 18:31:06 -04:00
Rich Felker
e882756311 reorganize pthread data structures and move the definitions to alltypes.h
this allows sys/types.h to provide the pthread types, as required by
POSIX. this design also facilitates forcing ABI-compatible sizes in
the arch-specific alltypes.h, while eliminating the need for
developers changing the internals of the pthread types to poke around
with arch-specific headers they may not be able to test.
2011-02-17 17:16:20 -05:00
Rich Felker
0b44a0315b initial check-in, version 0.5.0 2011-02-12 00:22:29 -05:00