xref: /aosp_15_r20/external/musl/src/thread/sem_trywait.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <semaphore.h>
2*c9945492SAndroid Build Coastguard Worker #include <limits.h>
3*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h"
4*c9945492SAndroid Build Coastguard Worker 
sem_trywait(sem_t * sem)5*c9945492SAndroid Build Coastguard Worker int sem_trywait(sem_t *sem)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	int val;
8*c9945492SAndroid Build Coastguard Worker 	while ((val=sem->__val[0]) & SEM_VALUE_MAX) {
9*c9945492SAndroid Build Coastguard Worker 		if (a_cas(sem->__val, val, val-1)==val) return 0;
10*c9945492SAndroid Build Coastguard Worker 	}
11*c9945492SAndroid Build Coastguard Worker 	errno = EAGAIN;
12*c9945492SAndroid Build Coastguard Worker 	return -1;
13*c9945492SAndroid Build Coastguard Worker }
14