Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 5 Nov 2010 07:04:32 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r214827 - user/davidxu/libthr/lib/libthr/thread
Message-ID:  <201011050704.oA574WE6087863@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidxu
Date: Fri Nov  5 07:04:32 2010
New Revision: 214827
URL: http://svn.freebsd.org/changeset/base/214827

Log:
  Account priority mutex we have locked, in cv_wait we use kernel based
  cv if the thread helds priority mutex.

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

Modified: user/davidxu/libthr/lib/libthr/thread/thr_mutex.c
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Fri Nov  5 07:03:35 2010	(r214826)
+++ user/davidxu/libthr/lib/libthr/thread/thr_mutex.c	Fri Nov  5 07:04:32 2010	(r214827)
@@ -865,6 +865,11 @@ enqueue_mutex(struct pthread *curthread,
 			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++;
+		_thread_printf(2, "priority mutex ++\n");
+	}
 }
 
 static void
@@ -881,7 +886,7 @@ dequeue_mutex(struct pthread *curthread,
 				TAILQ_REMOVE(&curthread->pp_mutexq, ml, qe);
 				set_inherited_priority(curthread, m);
 				_thr_mutex_link_free(ml);
-				break;
+				goto out;
 			}
 		}
 	} else if ((m->m_lock.m_flags & (UMUTEX_PRIO_INHERIT | 
@@ -890,8 +895,16 @@ dequeue_mutex(struct pthread *curthread,
 			if (ml->mutexp == m) {
 				TAILQ_REMOVE(&curthread->pi_mutexq, ml, qe);
 				_thr_mutex_link_free(ml);
-				break;
+				goto out;
 			}
 		}
 	}
+	return;
+
+out:
+	if ((m->m_lock.m_flags &
+	    (UMUTEX_PRIO_PROTECT|UMUTEX_PRIO_PROTECT)) != 0) {
+		_thread_printf(2, "priority mutex --\n");
+		curthread->priority_mutex_count--;
+	}
 }

Modified: user/davidxu/libthr/lib/libthr/thread/thr_private.h
==============================================================================
--- user/davidxu/libthr/lib/libthr/thread/thr_private.h	Fri Nov  5 07:03:35 2010	(r214826)
+++ user/davidxu/libthr/lib/libthr/thread/thr_private.h	Fri Nov  5 07:04:32 2010	(r214827)
@@ -440,7 +440,7 @@ struct pthread {
 #define	TLFLAGS_IN_TDLIST	0x0002	/* thread in all thread list */
 #define	TLFLAGS_IN_GCLIST	0x0004	/* thread in gc list */
 
-	/* Queue of currently owned NORMAL or PRIO_INHERIT type mutexes. */
+	/* Queue of currently owned PRIO_INHERIT type mutexes. */
 	struct mutex_link_list	pi_mutexq;
 
 	/* Queue of all owned PRIO_PROTECT mutexes. */
@@ -453,6 +453,9 @@ struct pthread {
 	struct pthread_specific_elem	*specific;
 	int				specific_data_count;
 
+	/* Number of priority mutex held. */
+	int			priority_mutex_count;
+
 	/* Number rwlocks rdlocks held. */
 	int			rdlock_count;
 



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