Browse Source

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.
Rich Felker 13 years ago
parent
commit
b6f9974ad8
1 changed files with 4 additions and 4 deletions
  1. 4 4
      src/thread/pthread_mutex_unlock.c

+ 4 - 4
src/thread/pthread_mutex_unlock.c

@@ -5,6 +5,7 @@ int pthread_mutex_unlock(pthread_mutex_t *m)
 	pthread_t self;
 	pthread_t self;
 	int waiters = m->_m_waiters;
 	int waiters = m->_m_waiters;
 	int cont;
 	int cont;
+	int robust = 0;
 
 
 	if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
 	if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
 		if (!m->_m_lock)
 		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)
 		if ((m->_m_type&3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count)
 			return m->_m_count--, 0;
 			return m->_m_count--, 0;
 		if (m->_m_type >= 4) {
 		if (m->_m_type >= 4) {
+			robust = 1;
 			self->robust_list.pending = &m->_m_next;
 			self->robust_list.pending = &m->_m_next;
 			*(void **)m->_m_prev = m->_m_next;
 			*(void **)m->_m_prev = m->_m_next;
 			if (m->_m_next) ((void **)m->_m_next)[-1] = m->_m_prev;
 			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);
 	cont = a_swap(&m->_m_lock, 0);
-wake:
+	if (robust)
+		self->robust_list.pending = 0;
 	if (waiters || cont<0)
 	if (waiters || cont<0)
 		__wake(&m->_m_lock, 1, 0);
 		__wake(&m->_m_lock, 1, 0);
 	return 0;
 	return 0;