diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2011-11-27 18:39:25 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2011-11-27 18:39:25 +0100 |
commit | db7bf9590dc08a72de9a9c46db7937188156fa2e (patch) | |
tree | e78cecd5099958ec7bfb645cebb8bae1722a3cfa | |
parent | 1d5bf69f1abd4bb556688b5af9ec2973fd5b3943 (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.c | 3 |
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); } |