1*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h" 2*c9945492SAndroid Build Coastguard Worker __pthread_rwlock_unlock(pthread_rwlock_t * rw)3*c9945492SAndroid Build Coastguard Workerint __pthread_rwlock_unlock(pthread_rwlock_t *rw) 4*c9945492SAndroid Build Coastguard Worker { 5*c9945492SAndroid Build Coastguard Worker int val, cnt, waiters, new, priv = rw->_rw_shared^128; 6*c9945492SAndroid Build Coastguard Worker 7*c9945492SAndroid Build Coastguard Worker do { 8*c9945492SAndroid Build Coastguard Worker val = rw->_rw_lock; 9*c9945492SAndroid Build Coastguard Worker cnt = val & 0x7fffffff; 10*c9945492SAndroid Build Coastguard Worker waiters = rw->_rw_waiters; 11*c9945492SAndroid Build Coastguard Worker new = (cnt == 0x7fffffff || cnt == 1) ? 0 : val-1; 12*c9945492SAndroid Build Coastguard Worker } while (a_cas(&rw->_rw_lock, val, new) != val); 13*c9945492SAndroid Build Coastguard Worker 14*c9945492SAndroid Build Coastguard Worker if (!new && (waiters || val<0)) 15*c9945492SAndroid Build Coastguard Worker __wake(&rw->_rw_lock, cnt, priv); 16*c9945492SAndroid Build Coastguard Worker 17*c9945492SAndroid Build Coastguard Worker return 0; 18*c9945492SAndroid Build Coastguard Worker } 19*c9945492SAndroid Build Coastguard Worker 20*c9945492SAndroid Build Coastguard Worker weak_alias(__pthread_rwlock_unlock, pthread_rwlock_unlock); 21