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