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;
11 if (type
!= PTHREAD_MUTEX_NORMAL
) {
12 self
= __pthread_self();
13 if ((m
->_m_lock
&0x7fffffff) != self
->tid
)
15 if ((type
&3) == PTHREAD_MUTEX_RECURSIVE
&& m
->_m_count
)
16 return m
->_m_count
--, 0;
18 self
->robust_list
.pending
= &m
->_m_next
;
21 volatile void *prev
= m
->_m_prev
;
22 volatile void *next
= m
->_m_next
;
23 *(volatile void *volatile *)prev
= next
;
24 if (next
!= &self
->robust_list
.head
) *(volatile void *volatile *)
25 ((char *)next
- sizeof(void *)) = prev
;
27 cont
= a_swap(&m
->_m_lock
, (type
& 8) ? 0x40000000 : 0);
28 if (type
!= PTHREAD_MUTEX_NORMAL
&& !priv
) {
29 self
->robust_list
.pending
= 0;
32 if (waiters
|| cont
<0)
33 __wake(&m
->_m_lock
, 1, priv
);
37 weak_alias(__pthread_mutex_unlock
, pthread_mutex_unlock
);