summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2011-11-27 18:39:25 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2011-11-27 18:39:25 +0100
commitdb7bf9590dc08a72de9a9c46db7937188156fa2e (patch)
treee78cecd5099958ec7bfb645cebb8bae1722a3cfa
parent1d5bf69f1abd4bb556688b5af9ec2973fd5b3943 (diff)
Fix __mutex_unlock_solid safety
libc releases the spinlock before calling __mutex_unlock_solid, so we have to try to reacquire it before possibly giving it to some blocked thread. * pthread/cthreads-compat.c (__mutex_unlock_solid): Call __pthread_spin_trylock before calling __pthread_mutex_unlock.
-rw-r--r--pthread/cthreads-compat.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/pthread/cthreads-compat.c b/pthread/cthreads-compat.c
index e0536ef..cbe8170 100644
--- a/pthread/cthreads-compat.c
+++ b/pthread/cthreads-compat.c
@@ -100,5 +100,8 @@ __mutex_lock_solid (void *lock)
void
__mutex_unlock_solid (void *lock)
{
+ if (__pthread_spin_trylock (lock) != 0)
+ /* Somebody already got the lock, that one will manage waking up others */
+ return;
__pthread_mutex_unlock (lock);
}