diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-12 20:56:59 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-12 20:56:59 +0000 |
commit | 52c9ef85a65f4dc25a4d1ff79c0fba1ed53ef43a (patch) | |
tree | 4b034bbe45a4e21907dda9e0a2af6d9adc2b63d0 /libpthread/linuxthreads/spinlock.c | |
parent | a8e76cbe147263a58d9e70e426d295858f9cd308 (diff) |
linuxthreads fixes from Will Newton (will.newton AT gmail.com):
* share Sys V semaphores in order to get appropriate SEM_UNDO semantics.
* correct guardaddr in pthread_free() for TLS case
* move spinlock unlocking before restart()
* When exit was called from a signal handler, the restart
from the manager processing the exit request instead restarted the thread
in pthread_cond_timedwait.
(see http://sources.redhat.com/ml/libc-ports/2006-05/msg00000.html)
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; } } |