1 #include "pthread_impl.h" 2 3 // Set a rw lock to init status: PTHREAD_RWLOCK_INITIALIZER __pthread__rwlock_unlock_inner(pthread_rwlock_t * m)4void __pthread__rwlock_unlock_inner(pthread_rwlock_t *m) 5 { 6 char *p = (char *)m; 7 for (size_t i = 0; i < sizeof(pthread_rwlock_t); i++) { 8 *(p + i) = 0; 9 } 10 } 11 12 #ifdef ENABLE_HWASAN 13 __attribute__((no_sanitize("hwaddress"))) 14 #endif __pthread_rwlock_unlock(pthread_rwlock_t * rw)15int __pthread_rwlock_unlock(pthread_rwlock_t *rw) 16 { 17 int val, cnt, waiters, new, priv = rw->_rw_shared^128; 18 19 do { 20 val = rw->_rw_lock; 21 cnt = val & 0x7fffffff; 22 waiters = rw->_rw_waiters; 23 new = (cnt == 0x7fffffff || cnt == 1) ? 0 : val-1; 24 } while (a_cas(&rw->_rw_lock, val, new) != val); 25 26 if (!new && (waiters || val<0)) 27 __wake(&rw->_rw_lock, cnt, priv); 28 29 return 0; 30 } 31 32 weak_alias(__pthread_rwlock_unlock, pthread_rwlock_unlock); 33