FreeBSD Bugzilla – Attachment 188857 Details for
Bug 224362
'mutex is on list' assertion failed on pthread_mutex_lock/pthread_mutex_unlock (up to FreeBSD 10.x)
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch for libthr
thr_mutex.c.patch (text/plain), 2.38 KB, created by
Andrey Sploshnov
on 2017-12-15 09:36:52 UTC
(
hide
)
Description:
Patch for libthr
Filename:
MIME Type:
Creator:
Andrey Sploshnov
Created:
2017-12-15 09:36:52 UTC
Size:
2.38 KB
patch
obsolete
>--- mm.c 2017-12-08 15:26:49.000000000 +0300 >+++ /usr/src/lib/libthr/thread/thr_mutex.c 2017-12-08 15:35:07.000000000 +0300 >@@ -150,6 +150,8 @@ > pmutex->m_count = 0; > pmutex->m_spinloops = 0; > pmutex->m_yieldloops = 0; >+ pmutex->m_qlock = 0; >+ pmutex->m_pp_qlock = 0; > MUTEX_INIT_LINK(pmutex); > switch(attr->m_protocol) { > case PTHREAD_PRIO_NONE: >@@ -278,24 +280,53 @@ > return (ret); > } > >+#define Q_LOOPS 1000 >+ >+#define Q_LOCK(m, mem) \ >+ do { \ >+ int q = Q_LOOPS; \ >+ while (q--) { \ >+ if (atomic_cmpset_acq_32(&m->mem, 0, 1)) \ >+ break; \ >+ } \ >+ } while (0) >+ >+#define Q_UNLOCK(m, mem) \ >+ do { \ >+ int q = Q_LOOPS; \ >+ while (q--) { \ >+ if (atomic_cmpset_acq_32(&m->mem, 1, 0)) \ >+ break; \ >+ } \ >+ } while (0) >+ > #define ENQUEUE_MUTEX(curthread, m) \ > do { \ > (m)->m_owner = curthread; \ > /* Add to the list of owned mutexes: */ \ > MUTEX_ASSERT_NOT_OWNED((m)); \ >- if (((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0) \ >+ if (((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0) { \ >+ Q_LOCK(m, m_qlock); \ > TAILQ_INSERT_TAIL(&curthread->mutexq, (m), m_qe);\ >- else \ >+ Q_UNLOCK(m, m_qlock); \ >+ } else { \ >+ Q_LOCK(m, m_pp_qlock); \ > TAILQ_INSERT_TAIL(&curthread->pp_mutexq, (m), m_qe);\ >+ Q_UNLOCK(m, m_pp_qlock); \ >+ } \ > } while (0) > > #define DEQUEUE_MUTEX(curthread, m) \ > (m)->m_owner = NULL; \ > MUTEX_ASSERT_IS_OWNED(m); \ >- if (__predict_true(((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)) \ >- TAILQ_REMOVE(&curthread->mutexq, (m), m_qe); \ >- else { \ >+ if (__predict_true(((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)) { \ >+ Q_LOCK(m, m_qlock); \ >+ TAILQ_REMOVE(&curthread->mutexq, (m), m_qe); \ >+ Q_UNLOCK(m, m_qlock); \ >+ } else { \ >+ Q_LOCK(m, m_pp_qlock); \ > TAILQ_REMOVE(&curthread->pp_mutexq, (m), m_qe); \ >+ Q_UNLOCK(m, m_pp_qlock); \ > set_inherited_priority(curthread, m); \ > } \ > MUTEX_INIT_LINK(m);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 224362
: 188857