semaphores: fix missed wakes from ABA bug in waiter count logic
[musl] / src / thread / sem_trywait.c
index 04edf46..beb435d 100644 (file)
@@ -1,12 +1,12 @@
 #include <semaphore.h>
+#include <limits.h>
 #include "pthread_impl.h"
 
 int sem_trywait(sem_t *sem)
 {
        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;
+       while ((val=sem->__val[0]) & SEM_VALUE_MAX) {
+               if (a_cas(sem->__val, val, val-1)==val) return 0;
        }
        errno = EAGAIN;
        return -1;