Update pthread futex_waiti() to unlock after yield
authorKevin Klues <klueska@cs.berkeley.edu>
Fri, 31 Jan 2014 22:00:35 +0000 (14:00 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Fri, 31 Jan 2014 22:14:37 +0000 (14:14 -0800)
commitc38db59b4ed5e5db98ea13ec646e1827a119c9ca
tree68aa49fec970e9d41a74c09d59a5c8bef12aa778
parentd83bad1b41c6d5abd646a58c80ddeb7b8ae3153a
Update pthread futex_waiti() to unlock after yield

The previous version of the futex code was adopted from the linux parlib
code, which doesn't have to worry about uthreads spuriously dropping
into vcore context while not holding a pdr lock.  Without this change,
it was possible for a vcore to spin indefinitely on a futex_wait() while
the uthread it was trying to wake had not actually yielded yet (and
couldn't because it was trying to yield on the very same vcore that was
spinning trying to wake it).

With this change we now have to hold the futex lock a little longer, but
it is necessary for correctness.  In the future, we will probably want
to use some sort of hashtable to maintain one lock per futex, rather
than a global futex lock, and this will help alleviate some of these
costs.
tests/signal_futex.c [new file with mode: 0644]
user/pthread/futex.c