소스 검색

fix excessive/insufficient wakes in __vm_unlock

there is no need to send a wake when the lock count does not hit zero,
but when it does, all waiters must be woken (since all with the same
sign are eligible to obtain the lock).
Rich Felker 13 년 전
부모
커밋
de543b05c8
1개의 변경된 파일3개의 추가작업 그리고 3개의 파일을 삭제
  1. 3 3
      src/thread/pthread_barrier_wait.c

+ 3 - 3
src/thread/pthread_barrier_wait.c

@@ -13,9 +13,9 @@ void __vm_lock(int inc)
 
 void __vm_unlock(void)
 {
-	if (vmlock[0]>0) a_dec(vmlock);
-	else a_inc(vmlock);
-	if (vmlock[1]) __wake(vmlock, 1, 1);
+	int inc = vmlock[0]>0 ? -1 : 1;
+	if (a_fetch_add(vmlock, inc)==-inc && vmlock[1])
+		__wake(vmlock, -1, 1);
 }
 
 static int pshared_barrier_wait(pthread_barrier_t *b)