From: Rich Felker Date: Tue, 8 Mar 2011 17:20:10 +0000 (-0500) Subject: simplify and optimize pthread_mutex_trylock X-Git-Tag: v0.7.0~30 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=31e06075d5a71b53461638ee871bfb6163e20dd5;p=oweals%2Fmusl.git simplify and optimize pthread_mutex_trylock --- diff --git a/src/thread/pthread_mutex_trylock.c b/src/thread/pthread_mutex_trylock.c index 7ff4f703..2dad7bbf 100644 --- a/src/thread/pthread_mutex_trylock.c +++ b/src/thread/pthread_mutex_trylock.c @@ -2,24 +2,23 @@ int pthread_mutex_trylock(pthread_mutex_t *m) { - pthread_t self; - if (m->_m_type != PTHREAD_MUTEX_NORMAL) { - self = pthread_self(); - if (m->_m_type == PTHREAD_MUTEX_RECURSIVE - && m->_m_owner == self->tid) { - if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN; - m->_m_count++; - return 0; - } - } + int tid; + + if (m->_m_type == PTHREAD_MUTEX_NORMAL) + return -a_xchg(&m->_m_lock, 1) & EBUSY; - if (a_xchg(&m->_m_lock, 1)) - if (m->_m_type == PTHREAD_MUTEX_ERRORCHECK - && m->_m_owner == self->tid) return EDEADLK; - else return EBUSY; - if (m->_m_type != PTHREAD_MUTEX_NORMAL) { - m->_m_owner = self->tid; - m->_m_count = 1; + tid = pthread_self()->tid; + + if (m->_m_owner == tid) { + if (m->_m_type != PTHREAD_MUTEX_RECURSIVE) + return EDEADLK; + if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN; + m->_m_count++; + return 0; } + + if (a_xchg(&m->_m_lock, 1)) return EBUSY; + m->_m_owner = tid; + m->_m_count = 1; return 0; }