#include "threads_impl.h" | |
#include <semaphore.h> | |
int sem_trywait(sem_t* sem) { | |
int val; | |
while ((val = atomic_load(&sem->_s_value)) > 0) { | |
int new = val - 1 - (val == 1 && atomic_load(&sem->_s_waiters)); | |
if (a_cas_shim(&sem->_s_value, val, new) == val) | |
return 0; | |
} | |
errno = EAGAIN; | |
return -1; | |
} |