summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-10-03 00:09:08 -0400
committerRich Felker <dalias@aerifal.cx>2011-10-03 00:09:08 -0400
commit7fe58d3511387ab6c57909f6e4baef58acd6bd56 (patch)
treec41921898477f2269c44b68b1befce6e6660cc0b
parentb3b00d11e87926b553429d341b020a8a070e4ea1 (diff)
downloadmusl-7fe58d3511387ab6c57909f6e4baef58acd6bd56.tar.gz
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.
-rw-r--r--src/thread/pthread_mutex_trylock.c2
-rw-r--r--src/thread/pthread_mutex_unlock.c4
2 files changed, 2 insertions, 4 deletions
diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c
index 4a424bc9..fb277970 100644
--- a/src/thread/pthread_mutex_trylock.c
+++ b/src/thread/pthread_mutex_trylock.c
@@ -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) {
diff --git a/src/thread/pthread_mutex_unlock.c b/src/thread/pthread_mutex_unlock.c
index 0f4a5e6c..05baec18 100644
--- a/src/thread/pthread_mutex_unlock.c
+++ b/src/thread/pthread_mutex_unlock.c
@@ -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;