• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <semaphore.h>
2 #include "pthread_impl.h"
3 
sem_post(sem_t * sem)4 int sem_post(sem_t *sem)
5 {
6 	int val, waiters, priv = sem->__val[2];
7 	do {
8 		val = sem->__val[0];
9 		waiters = sem->__val[1];
10 		if (val == SEM_VALUE_MAX) {
11 			errno = EOVERFLOW;
12 			return -1;
13 		}
14 	} while (a_cas(sem->__val, val, val+1+(val<0)) != val);
15 	if (val<0 || waiters) __wake(sem->__val, 1, priv);
16 	return 0;
17 }
18