• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "pthread_impl.h"
2 
__pthread_rwlock_unlock(pthread_rwlock_t * rw)3 int __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