aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-10-03 00:19:05 -0400
committerRich Felker <dalias@aerifal.cx>2011-10-03 00:19:05 -0400
commitb6f9974ad843b6b106db082fc44e710c0eb06e3b (patch)
tree28fec79a2715f8246dad423c5fdeff0a855ea34a /src
parentb8688ff87574fad6b3056443a5385010952fb243 (diff)
downloadmusl-b6f9974ad843b6b106db082fc44e710c0eb06e3b.zip
musl-b6f9974ad843b6b106db082fc44e710c0eb06e3b.tar.gz
musl-b6f9974ad843b6b106db082fc44e710c0eb06e3b.tar.bz2
simplify robust mutex unlock code path
right now it's questionable whether this change is an improvement or not, but if we later want to support priority inheritance mutexes, it will be important to have the code paths unified like this to avoid major code duplication.
Diffstat (limited to 'src')
-rw-r--r--src/thread/pthread_mutex_unlock.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/thread/pthread_mutex_unlock.c b/src/thread/pthread_mutex_unlock.c
index 6950872..fdf9fc1 100644
--- a/src/thread/pthread_mutex_unlock.c
+++ b/src/thread/pthread_mutex_unlock.c
@@ -5,6 +5,7 @@ int pthread_mutex_unlock(pthread_mutex_t *m)
pthread_t self;
int waiters = m->_m_waiters;
int cont;
+ int robust = 0;
if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
if (!m->_m_lock)
@@ -15,16 +16,15 @@ int pthread_mutex_unlock(pthread_mutex_t *m)
if ((m->_m_type&3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count)
return m->_m_count--, 0;
if (m->_m_type >= 4) {
+ robust = 1;
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;
- cont = a_swap(&m->_m_lock, 0);
- self->robust_list.pending = 0;
- goto wake;
}
}
cont = a_swap(&m->_m_lock, 0);
-wake:
+ if (robust)
+ self->robust_list.pending = 0;
if (waiters || cont<0)
__wake(&m->_m_lock, 1, 0);
return 0;