github.com/afumu/libc@v0.0.6/musl/src/thread/sem_post.c (about)

     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  }