From 31e06075d5a71b53461638ee871bfb6163e20dd5 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Tue, 8 Mar 2011 12:20:10 -0500 Subject: [PATCH] simplify and optimize pthread_mutex_trylock --- src/thread/pthread_mutex_trylock.c | 33 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) 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; } -- 2.25.1