|
Lines 150-155
Link Here
|
| 150 |
pmutex->m_count = 0; |
150 |
pmutex->m_count = 0; |
| 151 |
pmutex->m_spinloops = 0; |
151 |
pmutex->m_spinloops = 0; |
| 152 |
pmutex->m_yieldloops = 0; |
152 |
pmutex->m_yieldloops = 0; |
|
|
153 |
pmutex->m_qlock = 0; |
| 154 |
pmutex->m_pp_qlock = 0; |
| 153 |
MUTEX_INIT_LINK(pmutex); |
155 |
MUTEX_INIT_LINK(pmutex); |
| 154 |
switch(attr->m_protocol) { |
156 |
switch(attr->m_protocol) { |
| 155 |
case PTHREAD_PRIO_NONE: |
157 |
case PTHREAD_PRIO_NONE: |
|
Lines 278-301
Link Here
|
| 278 |
return (ret); |
280 |
return (ret); |
| 279 |
} |
281 |
} |
| 280 |
|
282 |
|
|
|
283 |
#define Q_LOOPS 1000 |
| 284 |
|
| 285 |
#define Q_LOCK(m, mem) \ |
| 286 |
do { \ |
| 287 |
int q = Q_LOOPS; \ |
| 288 |
while (q--) { \ |
| 289 |
if (atomic_cmpset_acq_32(&m->mem, 0, 1)) \ |
| 290 |
break; \ |
| 291 |
} \ |
| 292 |
} while (0) |
| 293 |
|
| 294 |
#define Q_UNLOCK(m, mem) \ |
| 295 |
do { \ |
| 296 |
int q = Q_LOOPS; \ |
| 297 |
while (q--) { \ |
| 298 |
if (atomic_cmpset_acq_32(&m->mem, 1, 0)) \ |
| 299 |
break; \ |
| 300 |
} \ |
| 301 |
} while (0) |
| 302 |
|
| 281 |
#define ENQUEUE_MUTEX(curthread, m) \ |
303 |
#define ENQUEUE_MUTEX(curthread, m) \ |
| 282 |
do { \ |
304 |
do { \ |
| 283 |
(m)->m_owner = curthread; \ |
305 |
(m)->m_owner = curthread; \ |
| 284 |
/* Add to the list of owned mutexes: */ \ |
306 |
/* Add to the list of owned mutexes: */ \ |
| 285 |
MUTEX_ASSERT_NOT_OWNED((m)); \ |
307 |
MUTEX_ASSERT_NOT_OWNED((m)); \ |
| 286 |
if (((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0) \ |
308 |
if (((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0) { \ |
|
|
309 |
Q_LOCK(m, m_qlock); \ |
| 287 |
TAILQ_INSERT_TAIL(&curthread->mutexq, (m), m_qe);\ |
310 |
TAILQ_INSERT_TAIL(&curthread->mutexq, (m), m_qe);\ |
| 288 |
else \ |
311 |
Q_UNLOCK(m, m_qlock); \ |
|
|
312 |
} else { \ |
| 313 |
Q_LOCK(m, m_pp_qlock); \ |
| 289 |
TAILQ_INSERT_TAIL(&curthread->pp_mutexq, (m), m_qe);\ |
314 |
TAILQ_INSERT_TAIL(&curthread->pp_mutexq, (m), m_qe);\ |
|
|
315 |
Q_UNLOCK(m, m_pp_qlock); \ |
| 316 |
} \ |
| 290 |
} while (0) |
317 |
} while (0) |
| 291 |
|
318 |
|
| 292 |
#define DEQUEUE_MUTEX(curthread, m) \ |
319 |
#define DEQUEUE_MUTEX(curthread, m) \ |
| 293 |
(m)->m_owner = NULL; \ |
320 |
(m)->m_owner = NULL; \ |
| 294 |
MUTEX_ASSERT_IS_OWNED(m); \ |
321 |
MUTEX_ASSERT_IS_OWNED(m); \ |
| 295 |
if (__predict_true(((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)) \ |
322 |
if (__predict_true(((m)->m_lock.m_flags & UMUTEX_PRIO_PROTECT) == 0)) { \ |
| 296 |
TAILQ_REMOVE(&curthread->mutexq, (m), m_qe); \ |
323 |
Q_LOCK(m, m_qlock); \ |
| 297 |
else { \ |
324 |
TAILQ_REMOVE(&curthread->mutexq, (m), m_qe); \ |
|
|
325 |
Q_UNLOCK(m, m_qlock); \ |
| 326 |
} else { \ |
| 327 |
Q_LOCK(m, m_pp_qlock); \ |
| 298 |
TAILQ_REMOVE(&curthread->pp_mutexq, (m), m_qe); \ |
328 |
TAILQ_REMOVE(&curthread->pp_mutexq, (m), m_qe); \ |
|
|
329 |
Q_UNLOCK(m, m_pp_qlock); \ |
| 299 |
set_inherited_priority(curthread, m); \ |
330 |
set_inherited_priority(curthread, m); \ |
| 300 |
} \ |
331 |
} \ |
| 301 |
MUTEX_INIT_LINK(m); |
332 |
MUTEX_INIT_LINK(m); |