diff options
-rw-r--r-- | src/thread/pthread_mutex_trylock.c | 33 |
1 files 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; } |