simplify robust mutex unlock code path
authorRich Felker <dalias@aerifal.cx>
Mon, 3 Oct 2011 04:19:05 +0000 (00:19 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 3 Oct 2011 04:19:05 +0000 (00:19 -0400)
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

index 6950872b5860187c9ce8bb7e277b95d9980e32b4..fdf9fc103ffd857c69c93658265fe86e006a01d9 100644 (file)
@@ -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;