some of this code should be cleaned up, e.g. using macros for some of the bit flags, masks, etc. nonetheless, the code is believed to be working and correct at this point.
25 lines
607 B
C
25 lines
607 B
C
#include "pthread_impl.h"
|
|
|
|
int pthread_mutex_unlock(pthread_mutex_t *m)
|
|
{
|
|
pthread_t self;
|
|
|
|
if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
|
|
self = __pthread_self();
|
|
if ((m->_m_lock&0x1fffffff) != self->tid)
|
|
return EPERM;
|
|
if ((m->_m_type&3) == PTHREAD_MUTEX_RECURSIVE && --m->_m_count)
|
|
return 0;
|
|
if (m->_m_type >= 4) {
|
|
self->robust_list.pending = &m->_m_next;
|
|
*(void **)m->_m_prev = m->_m_next;
|
|
if (m->_m_next) ((void **)m->_m_next)[-1] = m->_m_prev;
|
|
}
|
|
}
|
|
|
|
m->_m_lock = 0;
|
|
if (m->_m_waiters) __wake(&m->_m_lock, 1, 0);
|
|
if (m->_m_type >= 4) self->robust_list.pending = 0;
|
|
return 0;
|
|
}
|