xref: /aosp_15_r20/external/musl/src/thread/sem_post.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_post(sem_t * sem)5*c9945492SAndroid Build Coastguard Worker int sem_post(sem_t *sem)
6*c9945492SAndroid Build Coastguard Worker {
7*c9945492SAndroid Build Coastguard Worker 	int val, new, waiters, priv = sem->__val[2];
8*c9945492SAndroid Build Coastguard Worker 	do {
9*c9945492SAndroid Build Coastguard Worker 		val = sem->__val[0];
10*c9945492SAndroid Build Coastguard Worker 		waiters = sem->__val[1];
11*c9945492SAndroid Build Coastguard Worker 		if ((val & SEM_VALUE_MAX) == SEM_VALUE_MAX) {
12*c9945492SAndroid Build Coastguard Worker 			errno = EOVERFLOW;
13*c9945492SAndroid Build Coastguard Worker 			return -1;
14*c9945492SAndroid Build Coastguard Worker 		}
15*c9945492SAndroid Build Coastguard Worker 		new = val + 1;
16*c9945492SAndroid Build Coastguard Worker 		if (waiters <= 1)
17*c9945492SAndroid Build Coastguard Worker 			new &= ~0x80000000;
18*c9945492SAndroid Build Coastguard Worker 	} while (a_cas(sem->__val, val, new) != val);
19*c9945492SAndroid Build Coastguard Worker 	if (val<0) __wake(sem->__val, waiters>1 ? 1 : -1, priv);
20*c9945492SAndroid Build Coastguard Worker 	return 0;
21*c9945492SAndroid Build Coastguard Worker }
22