major semaphore improvements (performance and correctness)
[musl] / src / thread / sem_trywait.c
1 #include <semaphore.h>
2 #include "pthread_impl.h"
3
4 int sem_trywait(sem_t *sem)
5 {
6         if (a_fetch_add(sem->__val, -1) > 0) return 0;
7         if (!a_fetch_add(sem->__val, 1) && sem->__val[1])
8                 __wake(sem->__val, 1, 0);
9         errno = EAGAIN;
10         return -1;
11 }