1*c9945492SAndroid Build Coastguard Worker #include <semaphore.h> 2*c9945492SAndroid Build Coastguard Worker #include <limits.h> 3*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h" 4*c9945492SAndroid Build Coastguard Worker sem_post(sem_t * sem)5*c9945492SAndroid Build Coastguard Workerint sem_post(sem_t *sem) 6*c9945492SAndroid Build Coastguard Worker { 7*c9945492SAndroid Build Coastguard Worker int val, new, waiters, priv = sem->__val[2]; 8*c9945492SAndroid Build Coastguard Worker do { 9*c9945492SAndroid Build Coastguard Worker val = sem->__val[0]; 10*c9945492SAndroid Build Coastguard Worker waiters = sem->__val[1]; 11*c9945492SAndroid Build Coastguard Worker if ((val & SEM_VALUE_MAX) == SEM_VALUE_MAX) { 12*c9945492SAndroid Build Coastguard Worker errno = EOVERFLOW; 13*c9945492SAndroid Build Coastguard Worker return -1; 14*c9945492SAndroid Build Coastguard Worker } 15*c9945492SAndroid Build Coastguard Worker new = val + 1; 16*c9945492SAndroid Build Coastguard Worker if (waiters <= 1) 17*c9945492SAndroid Build Coastguard Worker new &= ~0x80000000; 18*c9945492SAndroid Build Coastguard Worker } while (a_cas(sem->__val, val, new) != val); 19*c9945492SAndroid Build Coastguard Worker if (val<0) __wake(sem->__val, waiters>1 ? 1 : -1, priv); 20*c9945492SAndroid Build Coastguard Worker return 0; 21*c9945492SAndroid Build Coastguard Worker } 22