simplify and improve new cond var implementation
authorRich Felker <dalias@aerifal.cx>
Mon, 18 Aug 2014 05:26:16 +0000 (01:26 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 18 Aug 2014 05:26:16 +0000 (01:26 -0400)
commit2c4b510bae1b2841e6983a5639dd600255898442
tree90937b95d648d6a63f96896747a4bcaadab03616
parent37195db8ec31300a87bc7ec09d2adcf299e9203d
simplify and improve new cond var implementation

previously, wake order could be unpredictable: if a waiter happened to
leave its futex wait on the state early, e.g. due to EAGAIN while
restarting after a signal handler, it could acquire the mutex out of
turn. handling this required ugly O(n) list walking in the unwait
function and accounting to remove waiters that already woke from the
list.

with the new changes, the "barrier" locks in each waiter node are only
unlocked in turn. in addition to simplifying the code, this seems to
improve performance slightly, probably by reducing the number of
accesses threads make to each other's stacks.

as an additional benefit, unrecoverable mutex re-locking errors
(mainly ENOTRECOVERABLE for robust mutexes) no longer need to be
handled with deadlock; they can be reported to the caller, since the
unlocking sequence makes it unnecessary to rely on the mutex to
synchronize access to the waiter list.
src/thread/pthread_cond_timedwait.c