OLD | NEW |
1 #include "pthread_impl.h" | 1 #include "pthread_impl.h" |
2 | 2 |
3 int __pthread_mutex_unlock(pthread_mutex_t *m) | 3 int __pthread_mutex_unlock(pthread_mutex_t* m) { |
4 { | 4 pthread_t self; |
5 » pthread_t self; | 5 int waiters = m->_m_waiters; |
6 » int waiters = m->_m_waiters; | 6 int cont; |
7 » int cont; | 7 int type = m->_m_type & 15; |
8 » int type = m->_m_type & 15; | 8 int priv = (m->_m_type & 128) ^ 128; |
9 » int priv = (m->_m_type & 128) ^ 128; | |
10 | 9 |
11 » if (type != PTHREAD_MUTEX_NORMAL) { | 10 if (type != PTHREAD_MUTEX_NORMAL) { |
12 » » self = __pthread_self(); | 11 self = __pthread_self(); |
13 » » if ((m->_m_lock&0x7fffffff) != self->tid) | 12 if ((m->_m_lock & 0x7fffffff) != self->tid) |
14 » » » return EPERM; | 13 return EPERM; |
15 » » if ((type&3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count) | 14 if ((type & 3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count) |
16 » » » return m->_m_count--, 0; | 15 return m->_m_count--, 0; |
17 » » if (!priv) { | 16 if (!priv) { |
18 » » » self->robust_list.pending = &m->_m_next; | 17 self->robust_list.pending = &m->_m_next; |
19 » » » __vm_lock(); | 18 __vm_lock(); |
20 » » } | 19 } |
21 » » volatile void *prev = m->_m_prev; | 20 volatile void* prev = m->_m_prev; |
22 » » volatile void *next = m->_m_next; | 21 volatile void* next = m->_m_next; |
23 » » *(volatile void *volatile *)prev = next; | 22 *(volatile void* volatile*)prev = next; |
24 » » if (next != &self->robust_list.head) *(volatile void *volatile *
) | 23 if (next != &self->robust_list.head) |
25 » » » ((char *)next - sizeof(void *)) = prev; | 24 *(volatile void* volatile*)((char*)next - sizeof(void*)) = prev; |
26 » } | 25 } |
27 » cont = a_swap(&m->_m_lock, (type & 8) ? 0x40000000 : 0); | 26 cont = a_swap(&m->_m_lock, (type & 8) ? 0x40000000 : 0); |
28 » if (type != PTHREAD_MUTEX_NORMAL && !priv) { | 27 if (type != PTHREAD_MUTEX_NORMAL && !priv) { |
29 » » self->robust_list.pending = 0; | 28 self->robust_list.pending = 0; |
30 » » __vm_unlock(); | 29 __vm_unlock(); |
31 » } | 30 } |
32 » if (waiters || cont<0) | 31 if (waiters || cont < 0) |
33 » » __wake(&m->_m_lock, 1, priv); | 32 __wake(&m->_m_lock, 1, priv); |
34 » return 0; | 33 return 0; |
35 } | 34 } |
36 | 35 |
37 weak_alias(__pthread_mutex_unlock, pthread_mutex_unlock); | 36 weak_alias(__pthread_mutex_unlock, pthread_mutex_unlock); |
OLD | NEW |