diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-03-08 12:20:10 -0500 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-03-08 12:20:10 -0500 |
commit | 31e06075d5a71b53461638ee871bfb6163e20dd5 (patch) | |
tree | 1e06d1e62fac16a812596e29acc11020edde638e /src/thread/pthread_mutex_trylock.c | |
parent | e5dd18319bbd47c89aac5e1571771958a43e067d (diff) | |
download | musl-31e06075d5a71b53461638ee871bfb6163e20dd5.tar.gz |
simplify and optimize pthread_mutex_trylock
Diffstat (limited to 'src/thread/pthread_mutex_trylock.c')
-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; } |