about summary refs log tree commit diff
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
parentafade2356ea148e715307be8f7334b790282341e (diff)
downloadmusl-7dd60b80f965af451f952b9f45bd9b6aec0fae74.tar.gz
musl-7dd60b80f965af451f952b9f45bd9b6aec0fae74.tar.xz
musl-7dd60b80f965af451f952b9f45bd9b6aec0fae74.zip
fix bug in synccall with no threads: lock was taken but never released
-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;