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 | cb8b53b9961543d9069284eedbe89abfc1d7713b (patch) | |
tree | 90c00c97726f891578e7ae3ac1d6744a1fdf88f5 | |
parent | a1a10da44a300bc501582db93280f257b2f87386 (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 e0536ef2..cbe8170e 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); } |