1 #include <semaphore.h> 2 #include "pthread_impl.h" 3 sem_post(sem_t * sem)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