1 #include "pthread_impl.h"
3 int __pthread_mutex_unlock(pthread_mutex_t
*m
)
6 int waiters
= m
->_m_waiters
;
8 int type
= m
->_m_type
& 15;
9 int priv
= (m
->_m_type
& 128) ^ 128;
13 if (type
!= PTHREAD_MUTEX_NORMAL
) {
14 self
= __pthread_self();
16 int own
= old
& 0x3fffffff;
19 if ((type
&3) == PTHREAD_MUTEX_RECURSIVE
&& m
->_m_count
)
20 return m
->_m_count
--, 0;
21 if ((type
&4) && (old
&0x40000000))
24 self
->robust_list
.pending
= &m
->_m_next
;
27 volatile void *prev
= m
->_m_prev
;
28 volatile void *next
= m
->_m_next
;
29 *(volatile void *volatile *)prev
= next
;
30 if (next
!= &self
->robust_list
.head
) *(volatile void *volatile *)
31 ((char *)next
- sizeof(void *)) = prev
;
34 if (old
<0 || a_cas(&m
->_m_lock
, old
, new)!=old
) {
35 if (new) a_store(&m
->_m_waiters
, -1);
36 __syscall(SYS_futex
, &m
->_m_lock
, FUTEX_UNLOCK_PI
|priv
);
41 cont
= a_swap(&m
->_m_lock
, new);
43 if (type
!= PTHREAD_MUTEX_NORMAL
&& !priv
) {
44 self
->robust_list
.pending
= 0;
47 if (waiters
|| cont
<0)
48 __wake(&m
->_m_lock
, 1, priv
);
52 weak_alias(__pthread_mutex_unlock
, pthread_mutex_unlock
);