use count=0 instead of 1 for recursive mutex with only one lock reference
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.
This commit is contained in:
parent
b3b00d11e8
commit
7fe58d3511
2 changed files with 2 additions and 4 deletions
|
|
@ -30,8 +30,6 @@ int pthread_mutex_trylock(pthread_mutex_t *m)
|
|||
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) {
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ int pthread_mutex_unlock(pthread_mutex_t *m)
|
|||
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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue