unify lock and owner fields of mutex structure
authorRich Felker <dalias@aerifal.cx>
Thu, 17 Mar 2011 16:21:32 +0000 (12:21 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 17 Mar 2011 16:21:32 +0000 (12:21 -0400)
this change is necessary to free up one slot in the mutex structure so
that we can use doubly-linked lists in the implementation of robust
mutexes.

src/internal/pthread_impl.h
src/thread/pthread_mutex_lock.c
src/thread/pthread_mutex_trylock.c
src/thread/pthread_mutex_unlock.c

index c17401113107079c6d0c44b402055f7914cabb54..102413f5b9872c15efbde5b1aa83ca0f78964321 100644 (file)
@@ -47,7 +47,6 @@ struct pthread {
 #define _m_type __u.__i[0]
 #define _m_lock __u.__i[1]
 #define _m_waiters __u.__i[2]
-#define _m_owner __u.__i[3]
 #define _m_count __u.__i[4]
 #define _c_block __u.__i[0]
 #define _c_clock __u.__i[1]
index 82556141e463b8a9a0d7ea4f7dcacebf5c296bdd..56111ec84f8951c09bd06c54731a3a3085c1bf07 100644 (file)
@@ -4,10 +4,11 @@ int pthread_mutex_lock(pthread_mutex_t *m)
 {
        int r;
        while ((r=pthread_mutex_trylock(m)) == EBUSY) {
+               if (!(r=m->_m_lock)) continue;
                if (m->_m_type == PTHREAD_MUTEX_ERRORCHECK
-                && m->_m_owner == pthread_self()->tid)
+                && r == pthread_self()->tid)
                        return EDEADLK;
-               __wait(&m->_m_lock, &m->_m_waiters, 1, 0);
+               __wait(&m->_m_lock, &m->_m_waiters, r, 0);
        }
        return r;
 }
index 6fc604fe1e731617e2510e8ff69989bb22dce559..de57ff9ec3b5d4e994748646d9b9d7ab925ec2ae 100644 (file)
@@ -9,14 +9,13 @@ int pthread_mutex_trylock(pthread_mutex_t *m)
 
        tid = pthread_self()->tid;
 
-       if (m->_m_owner == tid && m->_m_type == PTHREAD_MUTEX_RECURSIVE) {
+       if (m->_m_lock == tid && m->_m_type == PTHREAD_MUTEX_RECURSIVE) {
                if ((unsigned)m->_m_count >= INT_MAX) return EAGAIN;
                m->_m_count++;
                return 0;
        }
 
-       if (m->_m_owner || a_xchg(&m->_m_lock, 1)) return EBUSY;
-       m->_m_owner = tid;
+       if (m->_m_lock || a_cas(&m->_m_lock, 0, tid)) return EBUSY;
        m->_m_count = 1;
        return 0;
 }
index 39cea4b6d4fc0a9b45f43aa6671c51380f6a2031..61a2b9471b52615ef58e858f29095ed85115be16 100644 (file)
@@ -3,13 +3,12 @@
 int pthread_mutex_unlock(pthread_mutex_t *m)
 {
        if (m->_m_type != PTHREAD_MUTEX_NORMAL) {
-               if (m->_m_owner != pthread_self()->tid)
+               if (m->_m_lock != pthread_self()->tid)
                        return EPERM;
                if (m->_m_type == PTHREAD_MUTEX_RECURSIVE && --m->_m_count)
                        return 0;
        }
 
-       m->_m_owner = 0;
        m->_m_lock = 0;
        if (m->_m_waiters) __wake(&m->_m_lock, 1, 0);
        return 0;