svn commit: r214827 - user/davidxu/libthr/lib/libthr/thread
David Xu
davidxu at FreeBSD.org
Fri Nov 5 07:04:32 UTC 2010
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;
More information about the svn-src-user
mailing list