• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)4 void __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)15 int __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