cut out a syscall on thread creation in the case where guard size is 0
[musl] / src / thread / pthread_mutex_unlock.c
index 0275eb5..39cea4b 100644 (file)
@@ -2,16 +2,13 @@
 
 int pthread_mutex_unlock(pthread_mutex_t *m)
 {
-       if (m->_m_type == PTHREAD_MUTEX_RECURSIVE) {
-               if (a_fetch_add(&m->_m_lock, -1)==1 && m->_m_waiters)
-                       __wake(&m->_m_lock, 1, 0);
-               return 0;
+       if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
+               if (m->_m_owner != pthread_self()->tid)
+                       return EPERM;
+               if (m->_m_type == PTHREAD_MUTEX_RECURSIVE && --m->_m_count)
+                       return 0;
        }
 
-       if (m->_m_type == PTHREAD_MUTEX_ERRORCHECK
-        && m->_m_owner != pthread_self()->tid)
-               return EPERM;
-
        m->_m_owner = 0;
        m->_m_lock = 0;
        if (m->_m_waiters) __wake(&m->_m_lock, 1, 0);