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