From 047e434ef5fd5437a74f98f63c40a77a683f7f3f Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Thu, 17 Mar 2011 20:41:37 -0400 Subject: implement robust mutexes some of this code should be cleaned up, e.g. using macros for some of the bit flags, masks, etc. nonetheless, the code is believed to be working and correct at this point. --- src/thread/pthread_mutex_unlock.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'src/thread/pthread_mutex_unlock.c') diff --git a/src/thread/pthread_mutex_unlock.c b/src/thread/pthread_mutex_unlock.c index 3733788d..67aa7ba5 100644 --- a/src/thread/pthread_mutex_unlock.c +++ b/src/thread/pthread_mutex_unlock.c @@ -2,14 +2,23 @@ int pthread_mutex_unlock(pthread_mutex_t *m) { + pthread_t self; + if (m->_m_type != PTHREAD_MUTEX_NORMAL) { - if (!m->_m_lock || m->_m_lock != __pthread_self()->tid) + self = __pthread_self(); + if ((m->_m_lock&0x1fffffff) != self->tid) return EPERM; - if (m->_m_type == PTHREAD_MUTEX_RECURSIVE && --m->_m_count) + if ((m->_m_type&3) == PTHREAD_MUTEX_RECURSIVE && --m->_m_count) return 0; + if (m->_m_type >= 4) { + self->robust_list.pending = &m->_m_next; + *(void **)m->_m_prev = m->_m_next; + if (m->_m_next) ((void **)m->_m_next)[-1] = m->_m_prev; + } } m->_m_lock = 0; if (m->_m_waiters) __wake(&m->_m_lock, 1, 0); + if (m->_m_type >= 4) self->robust_list.pending = 0; return 0; } -- cgit v1.2.1