Browse Source

retry on cas failures in sem_trywait

this seems counter-intuitive since sem_trywait is supposed to just try
once, not wait for the semaphore. however, the retry loop is not a
wait. instead, it's to handle the case where the value changes due to
a simultaneous post or wait from another thread while the semaphore
value remains positive. in such a case, it's absolutely wrong for
sem_trywait to fail with EAGAIN because the semaphore is not busy.
Rich Felker 12 years ago
parent
commit
07e62953c7
1 changed files with 2 additions and 2 deletions
  1. 2 2
      src/thread/sem_trywait.c

+ 2 - 2
src/thread/sem_trywait.c

@@ -3,8 +3,8 @@
 
 int sem_trywait(sem_t *sem)
 {
-	int val = sem->__val[0];
-	if (val>0) {
+	int val;
+	while ((val=sem->__val[0]) > 0) {
 		int new = val-1-(val==1 && sem->__val[1]);
 		if (a_cas(sem->__val, val, new)==val) return 0;
 	}