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 c174011..102413f 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 8255614..56111ec 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 6fc604f..de57ff9 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 39cea4b..61a2b94 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;