Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Nov 2010 09:10:16 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r214832 - user/davidxu/libthr/lib/libthr/thread
Message-ID:  <201011050910.oA59AGYZ090781@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Fri Nov  5 09:10:16 2010
New Revision: 214832
URL: http://svn.freebsd.org/changeset/base/214832

Log:
  Count priority mutex correctly.

Modified:
  user/davidxu/libthr/lib/libthr/thread/thr_mutex.c

Modified: user/davidxu/libthr/lib/libthr/thread/thr_mutex.c
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Fri Nov  5 09:06:23 2010	(r214831)
+++ user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Fri Nov  5 09:10:16 2010	(r214832)
@@ -847,26 +847,24 @@ enqueue_mutex(struct pthread *curthread,
 	 * mutex is unlocked, so we should remember every PP mutex.
 	 */
 	if ((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) != 0) {
+		curthread->priority_mutex_count++;
 		ml = _thr_mutex_link_alloc();
 		ml->mutexp = m;
 		TAILQ_INSERT_TAIL(&curthread->pp_mutexq, ml, qe);
-	} else if ((m->m_lock.m_flags & (UMUTEX_PRIO_INHERIT |
-			USYNC_PROCESS_SHARED)) == UMUTEX_PRIO_INHERIT) {
+	} else if ((m->m_lock.m_flags & UMUTEX_PRIO_INHERIT) != 0) {
+		curthread->priority_mutex_count++;
 		/*
 		 * To make unlocking after fork() work, we need to link it,
 		 * because we still use TID as lock-word for PI mutex.
 		 * However, processs-shared mutex only has one copy, it should
-		 * not be unlockable for child process, so we don't link it.
+		 * not be unlockable for child process, so we don't link it,
+		 * and _mutex_fork() won't find it.
 		 */
-		if ((m->m_lock.m_flags & USYNC_PROCESS_SHARED) == 0) {
-			ml = _thr_mutex_link_alloc();
-			ml->mutexp = m;
-			TAILQ_INSERT_TAIL(&curthread->pi_mutexq, ml, qe);
-		}
-	}
-	if ((m->m_lock.m_flags &
-	    (UMUTEX_PRIO_PROTECT|UMUTEX_PRIO_PROTECT)) != 0) {
-		curthread->priority_mutex_count++;
+		if ((m->m_lock.m_flags & USYNC_PROCESS_SHARED) != 0)
+			return;
+		ml = _thr_mutex_link_alloc();
+		ml->mutexp = m;
+		TAILQ_INSERT_TAIL(&curthread->pi_mutexq, ml, qe);
 	}
 }
 
@@ -879,29 +877,25 @@ dequeue_mutex(struct pthread *curthread,
 		m->m_ownertd = NULL;
 
 	if ((m->m_lock.m_flags & UMUTEX_PRIO_PROTECT) != 0) {
+		curthread->priority_mutex_count--;
 		TAILQ_FOREACH(ml, &curthread->pp_mutexq, qe) {
 			if (ml->mutexp == m) {
 				TAILQ_REMOVE(&curthread->pp_mutexq, ml, qe);
 				set_inherited_priority(curthread, m);
 				_thr_mutex_link_free(ml);
-				goto out;
+				break;
 			}
 		}
-	} else if ((m->m_lock.m_flags & (UMUTEX_PRIO_INHERIT | 
-			USYNC_PROCESS_SHARED)) == UMUTEX_PRIO_INHERIT) {
+	} else if ((m->m_lock.m_flags & UMUTEX_PRIO_INHERIT) != 0) {
+		curthread->priority_mutex_count--;
+		if ((m->m_lock.m_flags & USYNC_PROCESS_SHARED) != 0)
+			return;
 		TAILQ_FOREACH(ml, &curthread->pi_mutexq, qe) {
 			if (ml->mutexp == m) {
 				TAILQ_REMOVE(&curthread->pi_mutexq, ml, qe);
 				_thr_mutex_link_free(ml);
-				goto out;
+				break;
 			}
 		}
 	}
-	return;
-
-out:
-	if ((m->m_lock.m_flags &
-	    (UMUTEX_PRIO_PROTECT|UMUTEX_PRIO_PROTECT)) != 0) {
-		curthread->priority_mutex_count--;
-	}
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011050910.oA59AGYZ090781>