xref: /third_party/musl/src/thread/pthread_rwlock_unlock.c
  • Home
  • History
  • Annotate Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
  • only in /third_party/musl/src/thread/
1570af302Sopenharmony_ci#include "pthread_impl.h"
2570af302Sopenharmony_ci
3570af302Sopenharmony_ciint __pthread_rwlock_unlock(pthread_rwlock_t *rw)
4570af302Sopenharmony_ci{
5570af302Sopenharmony_ci	int val, cnt, waiters, new, priv = rw->_rw_shared^128;
6570af302Sopenharmony_ci
7570af302Sopenharmony_ci	do {
8570af302Sopenharmony_ci		val = rw->_rw_lock;
9570af302Sopenharmony_ci		cnt = val & 0x7fffffff;
10570af302Sopenharmony_ci		waiters = rw->_rw_waiters;
11570af302Sopenharmony_ci		new = (cnt == 0x7fffffff || cnt == 1) ? 0 : val-1;
12570af302Sopenharmony_ci	} while (a_cas(&rw->_rw_lock, val, new) != val);
13570af302Sopenharmony_ci
14570af302Sopenharmony_ci	if (!new && (waiters || val<0))
15570af302Sopenharmony_ci		__wake(&rw->_rw_lock, cnt, priv);
16570af302Sopenharmony_ci
17570af302Sopenharmony_ci	return 0;
18570af302Sopenharmony_ci}
19570af302Sopenharmony_ci
20570af302Sopenharmony_ciweak_alias(__pthread_rwlock_unlock, pthread_rwlock_unlock);
21

Indexes created Thu Nov 07 10:32:03 CST 2024