avoid function call to pthread_self in mutex unlock
[musl] / src / thread / pthread_mutex_unlock.c
index 23e64ac..3733788 100644 (file)
@@ -2,18 +2,14 @@
 
 int pthread_mutex_unlock(pthread_mutex_t *m)
 {
-       if (m->__type == PTHREAD_MUTEX_RECURSIVE) {
-               if (a_fetch_add(&m->__lock, -1)==1 && m->__waiters)
-                       __wake(&m->__lock, 1, 0);
-               return 0;
+       if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
+               if (!m->_m_lock || m->_m_lock != __pthread_self()->tid)
+                       return EPERM;
+               if (m->_m_type == PTHREAD_MUTEX_RECURSIVE && --m->_m_count)
+                       return 0;
        }
 
-       if (m->__type == PTHREAD_MUTEX_ERRORCHECK
-        && m->__owner != pthread_self())
-               return EPERM;
-
-       m->__owner = 0;
-       m->__lock = 0;
-       if (m->__waiters) __wake(&m->__lock, 1, 0);
+       m->_m_lock = 0;
+       if (m->_m_waiters) __wake(&m->_m_lock, 1, 0);
        return 0;
 }