From b6f9974ad843b6b106db082fc44e710c0eb06e3b Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Mon, 3 Oct 2011 00:19:05 -0400 Subject: [PATCH] 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. --- src/thread/pthread_mutex_unlock.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/thread/pthread_mutex_unlock.c b/src/thread/pthread_mutex_unlock.c index 6950872b..fdf9fc10 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;