simplify and optimize pthread_mutex_trylock
authorRich Felker <dalias@aerifal.cx>
Tue, 8 Mar 2011 17:20:10 +0000 (12:20 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 8 Mar 2011 17:20:10 +0000 (12:20 -0500)
src/thread/pthread_mutex_trylock.c

index 7ff4f70..2dad7bb 100644 (file)
@@ -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;
 }