View | Details | Raw Unified | Return to bug 224362
Collapse All | Expand All

(-)/usr/src/lib/libthr/thread/thr_mutex.c (-5 / +36 lines)
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);

Return to bug 224362