فهرست منبع

fix bug in synccall with no threads: lock was taken but never released

Rich Felker 13 سال پیش
والد
کامیت
7dd60b80f9
1فایلهای تغییر یافته به همراه4 افزوده شده و 4 حذف شده
  1. 4 4
      src/thread/synccall.c

+ 4 - 4
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;