xref: /aosp_15_r20/external/musl/src/thread/sem_post.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1 #include <semaphore.h>
2 #include <limits.h>
3 #include "pthread_impl.h"
4 
sem_post(sem_t * sem)5 int sem_post(sem_t *sem)
6 {
7 	int val, new, waiters, priv = sem->__val[2];
8 	do {
9 		val = sem->__val[0];
10 		waiters = sem->__val[1];
11 		if ((val & SEM_VALUE_MAX) == SEM_VALUE_MAX) {
12 			errno = EOVERFLOW;
13 			return -1;
14 		}
15 		new = val + 1;
16 		if (waiters <= 1)
17 			new &= ~0x80000000;
18 	} while (a_cas(sem->__val, val, new) != val);
19 	if (val<0) __wake(sem->__val, waiters>1 ? 1 : -1, priv);
20 	return 0;
21 }
22