summaryrefslogtreecommitdiffstats
path: root/libpthread/linuxthreads/spinlock.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-03-12 20:56:23 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-03-12 20:56:23 +0000
commit3e14f4569fc85aaf53e3df9ffd6d9ec5b2ba5973 (patch)
treec3c1452b7f21fb2c0c08e8dbd1b036abe9bf4bf7 /libpthread/linuxthreads/spinlock.c
parenta2309e6df2ff5786c1951d8ecbcbb1d4ef8d5535 (diff)
downloaduClibc-alpine-3e14f4569fc85aaf53e3df9ffd6d9ec5b2ba5973.tar.bz2
uClibc-alpine-3e14f4569fc85aaf53e3df9ffd6d9ec5b2ba5973.tar.xz
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.c14
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;
}
}