this simplifies the code paths slightly, but perhaps what's nicer is
that it makes recursive mutexes fully reentrant, i.e. locking and
unlocking from a signal handler works even if the interrupted code was
in the middle of locking or unlocking.
if ((own && !(own & 0x40000000)) || a_cas(&m->_m_lock, old, tid)!=old)
return EBUSY;
- m->_m_count = 1;
-
if (m->_m_type < 4) return 0;
if (m->_m_type >= 8) {
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&3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count)
+ return m->_m_count--, 0;
if (m->_m_type >= 4) {
self->robust_list.pending = &m->_m_next;
*(void **)m->_m_prev = m->_m_next;