diff options
Diffstat (limited to 'libpthread/linuxthreads/spinlock.c')
-rw-r--r-- | libpthread/linuxthreads/spinlock.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/libpthread/linuxthreads/spinlock.c b/libpthread/linuxthreads/spinlock.c index f32540286..f0cf19c54 100644 --- a/libpthread/linuxthreads/spinlock.c +++ b/libpthread/linuxthreads/spinlock.c @@ -637,8 +637,20 @@ void __pthread_alt_unlock(struct _pthread_fastlock *lock) #if defined HAS_COMPARE_AND_SWAP wait_node_dequeue(pp_head, pp_max_prio, p_max_prio); #endif + + /* Release the spinlock *before* restarting. */ +#if defined TEST_FOR_COMPARE_AND_SWAP + if (!__pthread_has_cas) +#endif +#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP + { + __pthread_release(&lock->__spinlock); + } +#endif + restart(p_max_prio->thr); - break; + + return; } } |