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