summaryrefslogtreecommitdiff
path: root/src/thread/synccall.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-07-30 00:24:26 -0400
committerRich Felker <dalias@aerifal.cx>2011-07-30 00:24:26 -0400
commit7dd60b80f965af451f952b9f45bd9b6aec0fae74 (patch)
treef166001b5f5ef541cfcbc34155a7f27bd8d21120 /src/thread/synccall.c
parentafade2356ea148e715307be8f7334b790282341e (diff)
downloadmusl-7dd60b80f965af451f952b9f45bd9b6aec0fae74.tar.gz
fix bug in synccall with no threads: lock was taken but never released
Diffstat (limited to 'src/thread/synccall.c')
-rw-r--r--src/thread/synccall.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/thread/synccall.c b/src/thread/synccall.c
index 7c4f92bf..91ac5eb7 100644
--- a/src/thread/synccall.c
+++ b/src/thread/synccall.c
@@ -54,15 +54,15 @@ void __synccall(void (*func)(void *), void *ctx)
struct chain *cur, *next;
uint64_t oldmask;
- pthread_rwlock_wrlock(&lock);
-
- __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1}, &oldmask, 8);
-
if (!libc.threads_minus_1) {
func(ctx);
return;
}
+ pthread_rwlock_wrlock(&lock);
+
+ __syscall(SYS_rt_sigprocmask, SIG_BLOCK, (uint64_t[]){-1}, &oldmask, 8);
+
sem_init(&chaindone, 0, 0);
sem_init(&chainlock, 0, 1);
chainlen = 0;