aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDavid Xu <davidxu@FreeBSD.org>2007-10-31 01:50:48 +0000
committerDavid Xu <davidxu@FreeBSD.org>2007-10-31 01:50:48 +0000
commit56b45d9067e22d0ac0e971dc3af57097c60bc04c (patch)
treeda4457a1ca209349389b1f4f2ad668831bc619da /lib
parent55f18e070f684a9775e78ad8e5d92e1169b61e91 (diff)
Notes
Diffstat (limited to 'lib')
-rw-r--r--lib/libthr/thread/thr_mutex.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/libthr/thread/thr_mutex.c b/lib/libthr/thread/thr_mutex.c
index b54d70e4f263..a1f273421e93 100644
--- a/lib/libthr/thread/thr_mutex.c
+++ b/lib/libthr/thread/thr_mutex.c
@@ -366,6 +366,9 @@ mutex_lock_common(struct pthread *curthread, pthread_mutex_t *mutex,
* the lock is likely to be released quickly and it is
* faster than entering the kernel
*/
+ if (m->m_lock.m_flags & UMUTEX_PRIO_PROTECT)
+ goto sleep_in_kernel;
+
if (!_thr_is_smp)
goto yield_loop;
@@ -381,8 +384,7 @@ mutex_lock_common(struct pthread *curthread, pthread_mutex_t *mutex,
if (ret == 0)
goto done;
} else {
- if (_thr_spinloops != 0 &&
- !(m->m_lock.m_flags & UMUTEX_PRIO_PROTECT)) {
+ if (_thr_spinloops != 0) {
count = _thr_spinloops;
while (count) {
if (m->m_lock.m_owner == UMUTEX_UNOWNED) {
@@ -407,6 +409,7 @@ yield_loop:
}
}
+sleep_in_kernel:
if (abstime == NULL) {
ret = __thr_umutex_lock(&m->m_lock);
} else if (__predict_false(