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>