| 1 | #include <semaphore.h> |
| 2 | #include <limits.h> |
| 3 | #include "pthread_impl.h" |
| 4 | |
| 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 | } |