sem_post.c raw

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