Преглед на файлове

use count=0 instead of 1 for recursive mutex with only one lock reference

this simplifies the code paths slightly, but perhaps what's nicer is
that it makes recursive mutexes fully reentrant, i.e. locking and
unlocking from a signal handler works even if the interrupted code was
in the middle of locking or unlocking.
Rich Felker преди 13 години
родител
ревизия
7fe58d3511
променени са 2 файла, в които са добавени 2 реда и са изтрити 4 реда
  1. 0 2
      src/thread/pthread_mutex_trylock.c
  2. 2 2
      src/thread/pthread_mutex_unlock.c

+ 0 - 2
src/thread/pthread_mutex_trylock.c

@@ -30,8 +30,6 @@ int pthread_mutex_trylock(pthread_mutex_t *m)
 	if ((own && !(own & 0x40000000)) || a_cas(&m->_m_lock, old, tid)!=old)
 		return EBUSY;
 
-	m->_m_count = 1;
-
 	if (m->_m_type < 4) return 0;
 
 	if (m->_m_type >= 8) {

+ 2 - 2
src/thread/pthread_mutex_unlock.c

@@ -12,8 +12,8 @@ int pthread_mutex_unlock(pthread_mutex_t *m)
 		self = __pthread_self();
 		if ((m->_m_lock&0x1fffffff) != self->tid)
 			return EPERM;
-		if ((m->_m_type&3) == PTHREAD_MUTEX_RECURSIVE && --m->_m_count)
-			return 0;
+		if ((m->_m_type&3) == PTHREAD_MUTEX_RECURSIVE && m->_m_count)
+			return m->_m_count--, 0;
 		if (m->_m_type >= 4) {
 			self->robust_list.pending = &m->_m_next;
 			*(void **)m->_m_prev = m->_m_next;