提交 b6f9974a 编写于 作者: R Rich Felker

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.
上级 b8688ff8
...@@ -5,6 +5,7 @@ int pthread_mutex_unlock(pthread_mutex_t *m) ...@@ -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) ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册