xref: /titanic_52/usr/src/lib/libc/port/threads/synch.c (revision 40a3f5ceaf3ada360988c7cbb70c66f2d5588da4)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #include "lint.h"
28 #include "thr_uberdata.h"
29 #include <sys/rtpriocntl.h>
30 #include <sys/sdt.h>
31 #include <atomic.h>
32 
33 #if defined(THREAD_DEBUG)
34 #define	INCR32(x)	(((x) != UINT32_MAX)? (x)++ : 0)
35 #define	INCR(x)		((x)++)
36 #define	DECR(x)		((x)--)
37 #define	MAXINCR(m, x)	((m < ++x)? (m = x) : 0)
38 #else
39 #define	INCR32(x)
40 #define	INCR(x)
41 #define	DECR(x)
42 #define	MAXINCR(m, x)
43 #endif
44 
45 /*
46  * This mutex is initialized to be held by lwp#1.
47  * It is used to block a thread that has returned from a mutex_lock()
48  * of a LOCK_PRIO_INHERIT mutex with an unrecoverable error.
49  */
50 mutex_t	stall_mutex = DEFAULTMUTEX;
51 
52 static int shared_mutex_held(mutex_t *);
53 static int mutex_queuelock_adaptive(mutex_t *);
54 static void mutex_wakeup_all(mutex_t *);
55 
56 /*
57  * Lock statistics support functions.
58  */
59 void
60 record_begin_hold(tdb_mutex_stats_t *msp)
61 {
62 	tdb_incr(msp->mutex_lock);
63 	msp->mutex_begin_hold = gethrtime();
64 }
65 
66 hrtime_t
67 record_hold_time(tdb_mutex_stats_t *msp)
68 {
69 	hrtime_t now = gethrtime();
70 
71 	if (msp->mutex_begin_hold)
72 		msp->mutex_hold_time += now - msp->mutex_begin_hold;
73 	msp->mutex_begin_hold = 0;
74 	return (now);
75 }
76 
77 /*
78  * Called once at library initialization.
79  */
80 void
81 mutex_setup(void)
82 {
83 	if (set_lock_byte(&stall_mutex.mutex_lockw))
84 		thr_panic("mutex_setup() cannot acquire stall_mutex");
85 	stall_mutex.mutex_owner = (uintptr_t)curthread;
86 }
87 
88 /*
89  * The default spin count of 1000 is experimentally determined.
90  * On sun4u machines with any number of processors it could be raised
91  * to 10,000 but that (experimentally) makes almost no difference.
92  * The environment variable:
93  *	_THREAD_ADAPTIVE_SPIN=count
94  * can be used to override and set the count in the range [0 .. 1,000,000].
95  */
96 int	thread_adaptive_spin = 1000;
97 uint_t	thread_max_spinners = 100;
98 int	thread_queue_verify = 0;
99 static	int	ncpus;
100 
101 /*
102  * Distinguish spinning for queue locks from spinning for regular locks.
103  * We try harder to acquire queue locks by spinning.
104  * The environment variable:
105  *	_THREAD_QUEUE_SPIN=count
106  * can be used to override and set the count in the range [0 .. 1,000,000].
107  */
108 int	thread_queue_spin = 10000;
109 
110 #define	ALL_ATTRIBUTES				\
111 	(LOCK_RECURSIVE | LOCK_ERRORCHECK |	\
112 	LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT |	\
113 	LOCK_ROBUST)
114 
115 /*
116  * 'type' can be one of USYNC_THREAD, USYNC_PROCESS, or USYNC_PROCESS_ROBUST,
117  * augmented by zero or more the flags:
118  *	LOCK_RECURSIVE
119  *	LOCK_ERRORCHECK
120  *	LOCK_PRIO_INHERIT
121  *	LOCK_PRIO_PROTECT
122  *	LOCK_ROBUST
123  */
124 #pragma weak _mutex_init = mutex_init
125 /* ARGSUSED2 */
126 int
127 mutex_init(mutex_t *mp, int type, void *arg)
128 {
129 	int basetype = (type & ~ALL_ATTRIBUTES);
130 	const pcclass_t *pccp;
131 	int error = 0;
132 	int ceil;
133 
134 	if (basetype == USYNC_PROCESS_ROBUST) {
135 		/*
136 		 * USYNC_PROCESS_ROBUST is a deprecated historical type.
137 		 * We change it into (USYNC_PROCESS | LOCK_ROBUST) but
138 		 * retain the USYNC_PROCESS_ROBUST flag so we can return
139 		 * ELOCKUNMAPPED when necessary (only USYNC_PROCESS_ROBUST
140 		 * mutexes will ever draw ELOCKUNMAPPED).
141 		 */
142 		type |= (USYNC_PROCESS | LOCK_ROBUST);
143 		basetype = USYNC_PROCESS;
144 	}
145 
146 	if (type & LOCK_PRIO_PROTECT)
147 		pccp = get_info_by_policy(SCHED_FIFO);
148 	if ((basetype != USYNC_THREAD && basetype != USYNC_PROCESS) ||
149 	    (type & (LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT))
150 	    == (LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT) ||
151 	    ((type & LOCK_PRIO_PROTECT) &&
152 	    ((ceil = *(int *)arg) < pccp->pcc_primin ||
153 	    ceil > pccp->pcc_primax))) {
154 		error = EINVAL;
155 	} else if (type & LOCK_ROBUST) {
156 		/*
157 		 * Callers of mutex_init() with the LOCK_ROBUST attribute
158 		 * are required to pass an initially all-zero mutex.
159 		 * Multiple calls to mutex_init() are allowed; all but
160 		 * the first return EBUSY.  A call to mutex_init() is
161 		 * allowed to make an inconsistent robust lock consistent
162 		 * (for historical usage, even though the proper interface
163 		 * for this is mutex_consistent()).  Note that we use
164 		 * atomic_or_16() to set the LOCK_INITED flag so as
165 		 * not to disturb surrounding bits (LOCK_OWNERDEAD, etc).
166 		 */
167 		if (!(mp->mutex_flag & LOCK_INITED)) {
168 			mp->mutex_type = (uint8_t)type;
169 			atomic_or_16(&mp->mutex_flag, LOCK_INITED);
170 			mp->mutex_magic = MUTEX_MAGIC;
171 		} else if (type != mp->mutex_type ||
172 		    ((type & LOCK_PRIO_PROTECT) && mp->mutex_ceiling != ceil)) {
173 			error = EINVAL;
174 		} else if (mutex_consistent(mp) != 0) {
175 			error = EBUSY;
176 		}
177 		/* register a process robust mutex with the kernel */
178 		if (basetype == USYNC_PROCESS)
179 			register_lock(mp);
180 	} else {
181 		(void) memset(mp, 0, sizeof (*mp));
182 		mp->mutex_type = (uint8_t)type;
183 		mp->mutex_flag = LOCK_INITED;
184 		mp->mutex_magic = MUTEX_MAGIC;
185 	}
186 
187 	if (error == 0 && (type & LOCK_PRIO_PROTECT)) {
188 		mp->mutex_ceiling = ceil;
189 	}
190 
191 	/*
192 	 * This should be at the beginning of the function,
193 	 * but for the sake of old broken applications that
194 	 * do not have proper alignment for their mutexes
195 	 * (and don't check the return code from mutex_init),
196 	 * we put it here, after initializing the mutex regardless.
197 	 */
198 	if (error == 0 &&
199 	    ((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
200 	    curthread->ul_misaligned == 0)
201 		error = EINVAL;
202 
203 	return (error);
204 }
205 
206 /*
207  * Delete mp from list of ceiling mutexes owned by curthread.
208  * Return 1 if the head of the chain was updated.
209  */
210 int
211 _ceil_mylist_del(mutex_t *mp)
212 {
213 	ulwp_t *self = curthread;
214 	mxchain_t **mcpp;
215 	mxchain_t *mcp;
216 
217 	for (mcpp = &self->ul_mxchain;
218 	    (mcp = *mcpp) != NULL;
219 	    mcpp = &mcp->mxchain_next) {
220 		if (mcp->mxchain_mx == mp) {
221 			*mcpp = mcp->mxchain_next;
222 			lfree(mcp, sizeof (*mcp));
223 			return (mcpp == &self->ul_mxchain);
224 		}
225 	}
226 	return (0);
227 }
228 
229 /*
230  * Add mp to the list of ceiling mutexes owned by curthread.
231  * Return ENOMEM if no memory could be allocated.
232  */
233 int
234 _ceil_mylist_add(mutex_t *mp)
235 {
236 	ulwp_t *self = curthread;
237 	mxchain_t *mcp;
238 
239 	if ((mcp = lmalloc(sizeof (*mcp))) == NULL)
240 		return (ENOMEM);
241 	mcp->mxchain_mx = mp;
242 	mcp->mxchain_next = self->ul_mxchain;
243 	self->ul_mxchain = mcp;
244 	return (0);
245 }
246 
247 /*
248  * Helper function for _ceil_prio_inherit() and _ceil_prio_waive(), below.
249  */
250 static void
251 set_rt_priority(ulwp_t *self, int prio)
252 {
253 	pcparms_t pcparm;
254 
255 	pcparm.pc_cid = self->ul_rtclassid;
256 	((rtparms_t *)pcparm.pc_clparms)->rt_tqnsecs = RT_NOCHANGE;
257 	((rtparms_t *)pcparm.pc_clparms)->rt_pri = prio;
258 	(void) priocntl(P_LWPID, self->ul_lwpid, PC_SETPARMS, &pcparm);
259 }
260 
261 /*
262  * Inherit priority from ceiling.
263  * This changes the effective priority, not the assigned priority.
264  */
265 void
266 _ceil_prio_inherit(int prio)
267 {
268 	ulwp_t *self = curthread;
269 
270 	self->ul_epri = prio;
271 	set_rt_priority(self, prio);
272 }
273 
274 /*
275  * Waive inherited ceiling priority.  Inherit from head of owned ceiling locks
276  * if holding at least one ceiling lock.  If no ceiling locks are held at this
277  * point, disinherit completely, reverting back to assigned priority.
278  */
279 void
280 _ceil_prio_waive(void)
281 {
282 	ulwp_t *self = curthread;
283 	mxchain_t *mcp = self->ul_mxchain;
284 	int prio;
285 
286 	if (mcp == NULL) {
287 		prio = self->ul_pri;
288 		self->ul_epri = 0;
289 	} else {
290 		prio = mcp->mxchain_mx->mutex_ceiling;
291 		self->ul_epri = prio;
292 	}
293 	set_rt_priority(self, prio);
294 }
295 
296 /*
297  * Clear the lock byte.  Retain the waiters byte and the spinners byte.
298  * Return the old value of the lock word.
299  */
300 static uint32_t
301 clear_lockbyte(volatile uint32_t *lockword)
302 {
303 	uint32_t old;
304 	uint32_t new;
305 
306 	do {
307 		old = *lockword;
308 		new = old & ~LOCKMASK;
309 	} while (atomic_cas_32(lockword, old, new) != old);
310 
311 	return (old);
312 }
313 
314 /*
315  * Same as clear_lockbyte(), but operates on mutex_lockword64.
316  * The mutex_ownerpid field is cleared along with the lock byte.
317  */
318 static uint64_t
319 clear_lockbyte64(volatile uint64_t *lockword64)
320 {
321 	uint64_t old;
322 	uint64_t new;
323 
324 	do {
325 		old = *lockword64;
326 		new = old & ~LOCKMASK64;
327 	} while (atomic_cas_64(lockword64, old, new) != old);
328 
329 	return (old);
330 }
331 
332 /*
333  * Similar to set_lock_byte(), which only tries to set the lock byte.
334  * Here, we attempt to set the lock byte AND the mutex_ownerpid, keeping
335  * the remaining bytes constant.  This atomic operation is required for the
336  * correctness of process-shared robust locks, otherwise there would be
337  * a window or vulnerability in which the lock byte had been set but the
338  * mutex_ownerpid had not yet been set.  If the process were to die in
339  * this window of vulnerability (due to some other thread calling exit()
340  * or the process receiving a fatal signal), the mutex would be left locked
341  * but without a process-ID to determine which process was holding the lock.
342  * The kernel would then be unable to mark the robust mutex as LOCK_OWNERDEAD
343  * when the process died.  For all other cases of process-shared locks, this
344  * operation is just a convenience, for the sake of common code.
345  *
346  * This operation requires process-shared robust locks to be properly
347  * aligned on an 8-byte boundary, at least on sparc machines, lest the
348  * operation incur an alignment fault.  This is automatic when locks
349  * are declared properly using the mutex_t or pthread_mutex_t data types
350  * and the application does not allocate dynamic memory on less than an
351  * 8-byte boundary.  See the 'horrible hack' comments below for cases
352  * dealing with such broken applications.
353  */
354 static int
355 set_lock_byte64(volatile uint64_t *lockword64, pid_t ownerpid)
356 {
357 	uint64_t old;
358 	uint64_t new;
359 
360 	old = *lockword64 & ~LOCKMASK64;
361 	new = old | ((uint64_t)(uint_t)ownerpid << PIDSHIFT) | LOCKBYTE64;
362 	if (atomic_cas_64(lockword64, old, new) == old)
363 		return (LOCKCLEAR);
364 
365 	return (LOCKSET);
366 }
367 
368 /*
369  * Increment the spinners count in the mutex lock word.
370  * Return 0 on success.  Return -1 if the count would overflow.
371  */
372 static int
373 spinners_incr(volatile uint32_t *lockword, uint8_t max_spinners)
374 {
375 	uint32_t old;
376 	uint32_t new;
377 
378 	do {
379 		old = *lockword;
380 		if (((old & SPINNERMASK) >> SPINNERSHIFT) >= max_spinners)
381 			return (-1);
382 		new = old + (1 << SPINNERSHIFT);
383 	} while (atomic_cas_32(lockword, old, new) != old);
384 
385 	return (0);
386 }
387 
388 /*
389  * Decrement the spinners count in the mutex lock word.
390  * Return the new value of the lock word.
391  */
392 static uint32_t
393 spinners_decr(volatile uint32_t *lockword)
394 {
395 	uint32_t old;
396 	uint32_t new;
397 
398 	do {
399 		new = old = *lockword;
400 		if (new & SPINNERMASK)
401 			new -= (1 << SPINNERSHIFT);
402 	} while (atomic_cas_32(lockword, old, new) != old);
403 
404 	return (new);
405 }
406 
407 /*
408  * Non-preemptive spin locks.  Used by queue_lock().
409  * No lock statistics are gathered for these locks.
410  * No DTrace probes are provided for these locks.
411  */
412 void
413 spin_lock_set(mutex_t *mp)
414 {
415 	ulwp_t *self = curthread;
416 
417 	no_preempt(self);
418 	if (set_lock_byte(&mp->mutex_lockw) == 0) {
419 		mp->mutex_owner = (uintptr_t)self;
420 		return;
421 	}
422 	/*
423 	 * Spin for a while, attempting to acquire the lock.
424 	 */
425 	INCR32(self->ul_spin_lock_spin);
426 	if (mutex_queuelock_adaptive(mp) == 0 ||
427 	    set_lock_byte(&mp->mutex_lockw) == 0) {
428 		mp->mutex_owner = (uintptr_t)self;
429 		return;
430 	}
431 	/*
432 	 * Try harder if we were previously at a no premption level.
433 	 */
434 	if (self->ul_preempt > 1) {
435 		INCR32(self->ul_spin_lock_spin2);
436 		if (mutex_queuelock_adaptive(mp) == 0 ||
437 		    set_lock_byte(&mp->mutex_lockw) == 0) {
438 			mp->mutex_owner = (uintptr_t)self;
439 			return;
440 		}
441 	}
442 	/*
443 	 * Give up and block in the kernel for the mutex.
444 	 */
445 	INCR32(self->ul_spin_lock_sleep);
446 	(void) ___lwp_mutex_timedlock(mp, NULL);
447 	mp->mutex_owner = (uintptr_t)self;
448 }
449 
450 void
451 spin_lock_clear(mutex_t *mp)
452 {
453 	ulwp_t *self = curthread;
454 
455 	mp->mutex_owner = 0;
456 	if (atomic_swap_32(&mp->mutex_lockword, 0) & WAITERMASK) {
457 		(void) ___lwp_mutex_wakeup(mp, 0);
458 		INCR32(self->ul_spin_lock_wakeup);
459 	}
460 	preempt(self);
461 }
462 
463 /*
464  * Allocate the sleep queue hash table.
465  */
466 void
467 queue_alloc(void)
468 {
469 	ulwp_t *self = curthread;
470 	uberdata_t *udp = self->ul_uberdata;
471 	queue_head_t *qp;
472 	void *data;
473 	int i;
474 
475 	/*
476 	 * No locks are needed; we call here only when single-threaded.
477 	 */
478 	ASSERT(self == udp->ulwp_one);
479 	ASSERT(!udp->uberflags.uf_mt);
480 	if ((data = mmap(NULL, 2 * QHASHSIZE * sizeof (queue_head_t),
481 	    PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, (off_t)0))
482 	    == MAP_FAILED)
483 		thr_panic("cannot allocate thread queue_head table");
484 	udp->queue_head = qp = (queue_head_t *)data;
485 	for (i = 0; i < 2 * QHASHSIZE; qp++, i++) {
486 		qp->qh_type = (i < QHASHSIZE)? MX : CV;
487 		qp->qh_lock.mutex_flag = LOCK_INITED;
488 		qp->qh_lock.mutex_magic = MUTEX_MAGIC;
489 		qp->qh_hlist = &qp->qh_def_root;
490 #if defined(THREAD_DEBUG)
491 		qp->qh_hlen = 1;
492 		qp->qh_hmax = 1;
493 #endif
494 	}
495 }
496 
497 #if defined(THREAD_DEBUG)
498 
499 /*
500  * Debugging: verify correctness of a sleep queue.
501  */
502 void
503 QVERIFY(queue_head_t *qp)
504 {
505 	ulwp_t *self = curthread;
506 	uberdata_t *udp = self->ul_uberdata;
507 	queue_root_t *qrp;
508 	ulwp_t *ulwp;
509 	ulwp_t *prev;
510 	uint_t index;
511 	uint32_t cnt;
512 	char qtype;
513 	void *wchan;
514 
515 	ASSERT(qp >= udp->queue_head && (qp - udp->queue_head) < 2 * QHASHSIZE);
516 	ASSERT(MUTEX_OWNED(&qp->qh_lock, self));
517 	for (cnt = 0, qrp = qp->qh_hlist; qrp != NULL; qrp = qrp->qr_next) {
518 		cnt++;
519 		ASSERT((qrp->qr_head != NULL && qrp->qr_tail != NULL) ||
520 		    (qrp->qr_head == NULL && qrp->qr_tail == NULL));
521 	}
522 	ASSERT(qp->qh_hlen == cnt && qp->qh_hmax >= cnt);
523 	qtype = ((qp - udp->queue_head) < QHASHSIZE)? MX : CV;
524 	ASSERT(qp->qh_type == qtype);
525 	if (!thread_queue_verify)
526 		return;
527 	/* real expensive stuff, only for _THREAD_QUEUE_VERIFY */
528 	for (cnt = 0, qrp = qp->qh_hlist; qrp != NULL; qrp = qrp->qr_next) {
529 		for (prev = NULL, ulwp = qrp->qr_head; ulwp != NULL;
530 		    prev = ulwp, ulwp = ulwp->ul_link) {
531 			cnt++;
532 			if (ulwp->ul_writer)
533 				ASSERT(prev == NULL || prev->ul_writer);
534 			ASSERT(ulwp->ul_qtype == qtype);
535 			ASSERT(ulwp->ul_wchan != NULL);
536 			ASSERT(ulwp->ul_sleepq == qp);
537 			wchan = ulwp->ul_wchan;
538 			ASSERT(qrp->qr_wchan == wchan);
539 			index = QUEUE_HASH(wchan, qtype);
540 			ASSERT(&udp->queue_head[index] == qp);
541 		}
542 		ASSERT(qrp->qr_tail == prev);
543 	}
544 	ASSERT(qp->qh_qlen == cnt);
545 }
546 
547 #else	/* THREAD_DEBUG */
548 
549 #define	QVERIFY(qp)
550 
551 #endif	/* THREAD_DEBUG */
552 
553 /*
554  * Acquire a queue head.
555  */
556 queue_head_t *
557 queue_lock(void *wchan, int qtype)
558 {
559 	uberdata_t *udp = curthread->ul_uberdata;
560 	queue_head_t *qp;
561 	queue_root_t *qrp;
562 
563 	ASSERT(qtype == MX || qtype == CV);
564 
565 	/*
566 	 * It is possible that we could be called while still single-threaded.
567 	 * If so, we call queue_alloc() to allocate the queue_head[] array.
568 	 */
569 	if ((qp = udp->queue_head) == NULL) {
570 		queue_alloc();
571 		qp = udp->queue_head;
572 	}
573 	qp += QUEUE_HASH(wchan, qtype);
574 	spin_lock_set(&qp->qh_lock);
575 	for (qrp = qp->qh_hlist; qrp != NULL; qrp = qrp->qr_next)
576 		if (qrp->qr_wchan == wchan)
577 			break;
578 	if (qrp == NULL && qp->qh_def_root.qr_head == NULL) {
579 		/* the default queue root is available; use it */
580 		qrp = &qp->qh_def_root;
581 		qrp->qr_wchan = wchan;
582 		ASSERT(qrp->qr_next == NULL);
583 		ASSERT(qrp->qr_tail == NULL &&
584 		    qrp->qr_rtcount == 0 && qrp->qr_qlen == 0);
585 	}
586 	qp->qh_wchan = wchan;	/* valid until queue_unlock() is called */
587 	qp->qh_root = qrp;	/* valid until queue_unlock() is called */
588 	INCR32(qp->qh_lockcount);
589 	QVERIFY(qp);
590 	return (qp);
591 }
592 
593 /*
594  * Release a queue head.
595  */
596 void
597 queue_unlock(queue_head_t *qp)
598 {
599 	QVERIFY(qp);
600 	spin_lock_clear(&qp->qh_lock);
601 }
602 
603 /*
604  * For rwlock queueing, we must queue writers ahead of readers of the
605  * same priority.  We do this by making writers appear to have a half
606  * point higher priority for purposes of priority comparisons below.
607  */
608 #define	CMP_PRIO(ulwp)	((real_priority(ulwp) << 1) + (ulwp)->ul_writer)
609 
610 void
611 enqueue(queue_head_t *qp, ulwp_t *ulwp, int force_fifo)
612 {
613 	queue_root_t *qrp;
614 	ulwp_t **ulwpp;
615 	ulwp_t *next;
616 	int pri = CMP_PRIO(ulwp);
617 
618 	ASSERT(MUTEX_OWNED(&qp->qh_lock, curthread));
619 	ASSERT(ulwp->ul_sleepq != qp);
620 
621 	if ((qrp = qp->qh_root) == NULL) {
622 		/* use the thread's queue root for the linkage */
623 		qrp = &ulwp->ul_queue_root;
624 		qrp->qr_next = qp->qh_hlist;
625 		qrp->qr_prev = NULL;
626 		qrp->qr_head = NULL;
627 		qrp->qr_tail = NULL;
628 		qrp->qr_wchan = qp->qh_wchan;
629 		qrp->qr_rtcount = 0;
630 		qrp->qr_qlen = 0;
631 		qrp->qr_qmax = 0;
632 		qp->qh_hlist->qr_prev = qrp;
633 		qp->qh_hlist = qrp;
634 		qp->qh_root = qrp;
635 		MAXINCR(qp->qh_hmax, qp->qh_hlen);
636 	}
637 
638 	/*
639 	 * LIFO queue ordering is unfair and can lead to starvation,
640 	 * but it gives better performance for heavily contended locks.
641 	 * We use thread_queue_fifo (range is 0..8) to determine
642 	 * the frequency of FIFO vs LIFO queuing:
643 	 *	0 : every 256th time	(almost always LIFO)
644 	 *	1 : every 128th time
645 	 *	2 : every 64th  time
646 	 *	3 : every 32nd  time
647 	 *	4 : every 16th  time	(the default value, mostly LIFO)
648 	 *	5 : every 8th   time
649 	 *	6 : every 4th   time
650 	 *	7 : every 2nd   time
651 	 *	8 : every time		(never LIFO, always FIFO)
652 	 * Note that there is always some degree of FIFO ordering.
653 	 * This breaks live lock conditions that occur in applications
654 	 * that are written assuming (incorrectly) that threads acquire
655 	 * locks fairly, that is, in roughly round-robin order.
656 	 * In any event, the queue is maintained in kernel priority order.
657 	 *
658 	 * If force_fifo is non-zero, fifo queueing is forced.
659 	 * SUSV3 requires this for semaphores.
660 	 */
661 	if (qrp->qr_head == NULL) {
662 		/*
663 		 * The queue is empty.  LIFO/FIFO doesn't matter.
664 		 */
665 		ASSERT(qrp->qr_tail == NULL);
666 		ulwpp = &qrp->qr_head;
667 	} else if (force_fifo |
668 	    (((++qp->qh_qcnt << curthread->ul_queue_fifo) & 0xff) == 0)) {
669 		/*
670 		 * Enqueue after the last thread whose priority is greater
671 		 * than or equal to the priority of the thread being queued.
672 		 * Attempt first to go directly onto the tail of the queue.
673 		 */
674 		if (pri <= CMP_PRIO(qrp->qr_tail))
675 			ulwpp = &qrp->qr_tail->ul_link;
676 		else {
677 			for (ulwpp = &qrp->qr_head; (next = *ulwpp) != NULL;
678 			    ulwpp = &next->ul_link)
679 				if (pri > CMP_PRIO(next))
680 					break;
681 		}
682 	} else {
683 		/*
684 		 * Enqueue before the first thread whose priority is less
685 		 * than or equal to the priority of the thread being queued.
686 		 * Hopefully we can go directly onto the head of the queue.
687 		 */
688 		for (ulwpp = &qrp->qr_head; (next = *ulwpp) != NULL;
689 		    ulwpp = &next->ul_link)
690 			if (pri >= CMP_PRIO(next))
691 				break;
692 	}
693 	if ((ulwp->ul_link = *ulwpp) == NULL)
694 		qrp->qr_tail = ulwp;
695 	*ulwpp = ulwp;
696 
697 	ulwp->ul_sleepq = qp;
698 	ulwp->ul_wchan = qp->qh_wchan;
699 	ulwp->ul_qtype = qp->qh_type;
700 	if ((ulwp->ul_schedctl != NULL &&
701 	    ulwp->ul_schedctl->sc_cid == ulwp->ul_rtclassid) |
702 	    ulwp->ul_pilocks) {
703 		ulwp->ul_rtqueued = 1;
704 		qrp->qr_rtcount++;
705 	}
706 	MAXINCR(qrp->qr_qmax, qrp->qr_qlen);
707 	MAXINCR(qp->qh_qmax, qp->qh_qlen);
708 }
709 
710 /*
711  * Helper function for queue_slot() and queue_slot_rt().
712  * Try to find a non-suspended thread on the queue.
713  */
714 static ulwp_t **
715 queue_slot_runnable(ulwp_t **ulwpp, ulwp_t **prevp, int rt)
716 {
717 	ulwp_t *ulwp;
718 	ulwp_t **foundpp = NULL;
719 	int priority = -1;
720 	ulwp_t *prev;
721 	int tpri;
722 
723 	for (prev = NULL;
724 	    (ulwp = *ulwpp) != NULL;
725 	    prev = ulwp, ulwpp = &ulwp->ul_link) {
726 		if (ulwp->ul_stop)	/* skip suspended threads */
727 			continue;
728 		tpri = rt? CMP_PRIO(ulwp) : 0;
729 		if (tpri > priority) {
730 			foundpp = ulwpp;
731 			*prevp = prev;
732 			priority = tpri;
733 			if (!rt)
734 				break;
735 		}
736 	}
737 	return (foundpp);
738 }
739 
740 /*
741  * For real-time, we search the entire queue because the dispatch
742  * (kernel) priorities may have changed since enqueueing.
743  */
744 static ulwp_t **
745 queue_slot_rt(ulwp_t **ulwpp_org, ulwp_t **prevp)
746 {
747 	ulwp_t **ulwpp = ulwpp_org;
748 	ulwp_t *ulwp = *ulwpp;
749 	ulwp_t **foundpp = ulwpp;
750 	int priority = CMP_PRIO(ulwp);
751 	ulwp_t *prev;
752 	int tpri;
753 
754 	for (prev = ulwp, ulwpp = &ulwp->ul_link;
755 	    (ulwp = *ulwpp) != NULL;
756 	    prev = ulwp, ulwpp = &ulwp->ul_link) {
757 		tpri = CMP_PRIO(ulwp);
758 		if (tpri > priority) {
759 			foundpp = ulwpp;
760 			*prevp = prev;
761 			priority = tpri;
762 		}
763 	}
764 	ulwp = *foundpp;
765 
766 	/*
767 	 * Try not to return a suspended thread.
768 	 * This mimics the old libthread's behavior.
769 	 */
770 	if (ulwp->ul_stop &&
771 	    (ulwpp = queue_slot_runnable(ulwpp_org, prevp, 1)) != NULL) {
772 		foundpp = ulwpp;
773 		ulwp = *foundpp;
774 	}
775 	ulwp->ul_rt = 1;
776 	return (foundpp);
777 }
778 
779 ulwp_t **
780 queue_slot(queue_head_t *qp, ulwp_t **prevp, int *more)
781 {
782 	queue_root_t *qrp;
783 	ulwp_t **ulwpp;
784 	ulwp_t *ulwp;
785 	int rt;
786 
787 	ASSERT(MUTEX_OWNED(&qp->qh_lock, curthread));
788 
789 	if ((qrp = qp->qh_root) == NULL || (ulwp = qrp->qr_head) == NULL) {
790 		*more = 0;
791 		return (NULL);		/* no lwps on the queue */
792 	}
793 	rt = (qrp->qr_rtcount != 0);
794 	*prevp = NULL;
795 	if (ulwp->ul_link == NULL) {	/* only one lwp on the queue */
796 		*more = 0;
797 		ulwp->ul_rt = rt;
798 		return (&qrp->qr_head);
799 	}
800 	*more = 1;
801 
802 	if (rt)		/* real-time queue */
803 		return (queue_slot_rt(&qrp->qr_head, prevp));
804 	/*
805 	 * Try not to return a suspended thread.
806 	 * This mimics the old libthread's behavior.
807 	 */
808 	if (ulwp->ul_stop &&
809 	    (ulwpp = queue_slot_runnable(&qrp->qr_head, prevp, 0)) != NULL) {
810 		ulwp = *ulwpp;
811 		ulwp->ul_rt = 0;
812 		return (ulwpp);
813 	}
814 	/*
815 	 * The common case; just pick the first thread on the queue.
816 	 */
817 	ulwp->ul_rt = 0;
818 	return (&qrp->qr_head);
819 }
820 
821 /*
822  * Common code for unlinking an lwp from a user-level sleep queue.
823  */
824 void
825 queue_unlink(queue_head_t *qp, ulwp_t **ulwpp, ulwp_t *prev)
826 {
827 	queue_root_t *qrp = qp->qh_root;
828 	queue_root_t *nqrp;
829 	ulwp_t *ulwp = *ulwpp;
830 	ulwp_t *next;
831 
832 	ASSERT(MUTEX_OWNED(&qp->qh_lock, curthread));
833 	ASSERT(qp->qh_wchan != NULL && ulwp->ul_wchan == qp->qh_wchan);
834 
835 	DECR(qp->qh_qlen);
836 	DECR(qrp->qr_qlen);
837 	if (ulwp->ul_rtqueued) {
838 		ulwp->ul_rtqueued = 0;
839 		qrp->qr_rtcount--;
840 	}
841 	next = ulwp->ul_link;
842 	*ulwpp = next;
843 	ulwp->ul_link = NULL;
844 	if (qrp->qr_tail == ulwp)
845 		qrp->qr_tail = prev;
846 	if (qrp == &ulwp->ul_queue_root) {
847 		/*
848 		 * We can't continue to use the unlinked thread's
849 		 * queue root for the linkage.
850 		 */
851 		queue_root_t *qr_next = qrp->qr_next;
852 		queue_root_t *qr_prev = qrp->qr_prev;
853 
854 		if (qrp->qr_tail) {
855 			/* switch to using the last thread's queue root */
856 			ASSERT(qrp->qr_qlen != 0);
857 			nqrp = &qrp->qr_tail->ul_queue_root;
858 			*nqrp = *qrp;
859 			if (qr_next)
860 				qr_next->qr_prev = nqrp;
861 			if (qr_prev)
862 				qr_prev->qr_next = nqrp;
863 			else
864 				qp->qh_hlist = nqrp;
865 			qp->qh_root = nqrp;
866 		} else {
867 			/* empty queue root; just delete from the hash list */
868 			ASSERT(qrp->qr_qlen == 0);
869 			if (qr_next)
870 				qr_next->qr_prev = qr_prev;
871 			if (qr_prev)
872 				qr_prev->qr_next = qr_next;
873 			else
874 				qp->qh_hlist = qr_next;
875 			qp->qh_root = NULL;
876 			DECR(qp->qh_hlen);
877 		}
878 	}
879 }
880 
881 ulwp_t *
882 dequeue(queue_head_t *qp, int *more)
883 {
884 	ulwp_t **ulwpp;
885 	ulwp_t *ulwp;
886 	ulwp_t *prev;
887 
888 	if ((ulwpp = queue_slot(qp, &prev, more)) == NULL)
889 		return (NULL);
890 	ulwp = *ulwpp;
891 	queue_unlink(qp, ulwpp, prev);
892 	ulwp->ul_sleepq = NULL;
893 	ulwp->ul_wchan = NULL;
894 	return (ulwp);
895 }
896 
897 /*
898  * Return a pointer to the highest priority thread sleeping on wchan.
899  */
900 ulwp_t *
901 queue_waiter(queue_head_t *qp)
902 {
903 	ulwp_t **ulwpp;
904 	ulwp_t *prev;
905 	int more;
906 
907 	if ((ulwpp = queue_slot(qp, &prev, &more)) == NULL)
908 		return (NULL);
909 	return (*ulwpp);
910 }
911 
912 int
913 dequeue_self(queue_head_t *qp)
914 {
915 	ulwp_t *self = curthread;
916 	queue_root_t *qrp;
917 	ulwp_t **ulwpp;
918 	ulwp_t *ulwp;
919 	ulwp_t *prev;
920 	int found = 0;
921 
922 	ASSERT(MUTEX_OWNED(&qp->qh_lock, self));
923 
924 	/* find self on the sleep queue */
925 	if ((qrp = qp->qh_root) != NULL) {
926 		for (prev = NULL, ulwpp = &qrp->qr_head;
927 		    (ulwp = *ulwpp) != NULL;
928 		    prev = ulwp, ulwpp = &ulwp->ul_link) {
929 			if (ulwp == self) {
930 				queue_unlink(qp, ulwpp, prev);
931 				self->ul_cvmutex = NULL;
932 				self->ul_sleepq = NULL;
933 				self->ul_wchan = NULL;
934 				found = 1;
935 				break;
936 			}
937 		}
938 	}
939 
940 	if (!found)
941 		thr_panic("dequeue_self(): curthread not found on queue");
942 
943 	return ((qrp = qp->qh_root) != NULL && qrp->qr_head != NULL);
944 }
945 
946 /*
947  * Called from call_user_handler() and _thrp_suspend() to take
948  * ourself off of our sleep queue so we can grab locks.
949  */
950 void
951 unsleep_self(void)
952 {
953 	ulwp_t *self = curthread;
954 	queue_head_t *qp;
955 
956 	/*
957 	 * Calling enter_critical()/exit_critical() here would lead
958 	 * to recursion.  Just manipulate self->ul_critical directly.
959 	 */
960 	self->ul_critical++;
961 	while (self->ul_sleepq != NULL) {
962 		qp = queue_lock(self->ul_wchan, self->ul_qtype);
963 		/*
964 		 * We may have been moved from a CV queue to a
965 		 * mutex queue while we were attempting queue_lock().
966 		 * If so, just loop around and try again.
967 		 * dequeue_self() clears self->ul_sleepq.
968 		 */
969 		if (qp == self->ul_sleepq)
970 			(void) dequeue_self(qp);
971 		queue_unlock(qp);
972 	}
973 	self->ul_writer = 0;
974 	self->ul_critical--;
975 }
976 
977 /*
978  * Common code for calling the the ___lwp_mutex_timedlock() system call.
979  * Returns with mutex_owner and mutex_ownerpid set correctly.
980  */
981 static int
982 mutex_lock_kernel(mutex_t *mp, timespec_t *tsp, tdb_mutex_stats_t *msp)
983 {
984 	ulwp_t *self = curthread;
985 	uberdata_t *udp = self->ul_uberdata;
986 	int mtype = mp->mutex_type;
987 	hrtime_t begin_sleep;
988 	int acquired;
989 	int error;
990 
991 	self->ul_sp = stkptr();
992 	self->ul_wchan = mp;
993 	if (__td_event_report(self, TD_SLEEP, udp)) {
994 		self->ul_td_evbuf.eventnum = TD_SLEEP;
995 		self->ul_td_evbuf.eventdata = mp;
996 		tdb_event(TD_SLEEP, udp);
997 	}
998 	if (msp) {
999 		tdb_incr(msp->mutex_sleep);
1000 		begin_sleep = gethrtime();
1001 	}
1002 
1003 	DTRACE_PROBE1(plockstat, mutex__block, mp);
1004 
1005 	/* defer signals until the assignment of mp->mutex_owner */
1006 	sigoff(self);
1007 	for (;;) {
1008 		/*
1009 		 * A return value of EOWNERDEAD or ELOCKUNMAPPED
1010 		 * means we successfully acquired the lock.
1011 		 */
1012 		if ((error = ___lwp_mutex_timedlock(mp, tsp)) != 0 &&
1013 		    error != EOWNERDEAD && error != ELOCKUNMAPPED) {
1014 			acquired = 0;
1015 			break;
1016 		}
1017 
1018 		if (mtype & USYNC_PROCESS) {
1019 			/*
1020 			 * Defend against forkall().  We may be the child,
1021 			 * in which case we don't actually own the mutex.
1022 			 */
1023 			enter_critical(self);
1024 			if (mp->mutex_ownerpid == udp->pid) {
1025 				mp->mutex_owner = (uintptr_t)self;
1026 				exit_critical(self);
1027 				acquired = 1;
1028 				break;
1029 			}
1030 			exit_critical(self);
1031 		} else {
1032 			mp->mutex_owner = (uintptr_t)self;
1033 			acquired = 1;
1034 			break;
1035 		}
1036 	}
1037 	sigon(self);
1038 
1039 	if (msp)
1040 		msp->mutex_sleep_time += gethrtime() - begin_sleep;
1041 	self->ul_wchan = NULL;
1042 	self->ul_sp = 0;
1043 
1044 	if (acquired) {
1045 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 1);
1046 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
1047 	} else {
1048 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 0);
1049 		DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1050 	}
1051 
1052 	return (error);
1053 }
1054 
1055 /*
1056  * Common code for calling the ___lwp_mutex_trylock() system call.
1057  * Returns with mutex_owner and mutex_ownerpid set correctly.
1058  */
1059 int
1060 mutex_trylock_kernel(mutex_t *mp)
1061 {
1062 	ulwp_t *self = curthread;
1063 	uberdata_t *udp = self->ul_uberdata;
1064 	int mtype = mp->mutex_type;
1065 	int error;
1066 	int acquired;
1067 
1068 	sigoff(self);
1069 	for (;;) {
1070 		/*
1071 		 * A return value of EOWNERDEAD or ELOCKUNMAPPED
1072 		 * means we successfully acquired the lock.
1073 		 */
1074 		if ((error = ___lwp_mutex_trylock(mp)) != 0 &&
1075 		    error != EOWNERDEAD && error != ELOCKUNMAPPED) {
1076 			acquired = 0;
1077 			break;
1078 		}
1079 
1080 		if (mtype & USYNC_PROCESS) {
1081 			/*
1082 			 * Defend against forkall().  We may be the child,
1083 			 * in which case we don't actually own the mutex.
1084 			 */
1085 			enter_critical(self);
1086 			if (mp->mutex_ownerpid == udp->pid) {
1087 				mp->mutex_owner = (uintptr_t)self;
1088 				exit_critical(self);
1089 				acquired = 1;
1090 				break;
1091 			}
1092 			exit_critical(self);
1093 		} else {
1094 			mp->mutex_owner = (uintptr_t)self;
1095 			acquired = 1;
1096 			break;
1097 		}
1098 	}
1099 	sigon(self);
1100 
1101 	if (acquired) {
1102 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
1103 	} else if (error != EBUSY) {
1104 		DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1105 	}
1106 
1107 	return (error);
1108 }
1109 
1110 volatile sc_shared_t *
1111 setup_schedctl(void)
1112 {
1113 	ulwp_t *self = curthread;
1114 	volatile sc_shared_t *scp;
1115 	sc_shared_t *tmp;
1116 
1117 	if ((scp = self->ul_schedctl) == NULL && /* no shared state yet */
1118 	    !self->ul_vfork &&			/* not a child of vfork() */
1119 	    !self->ul_schedctl_called) {	/* haven't been called before */
1120 		enter_critical(self);
1121 		self->ul_schedctl_called = &self->ul_uberdata->uberflags;
1122 		if ((tmp = __schedctl()) != (sc_shared_t *)(-1))
1123 			self->ul_schedctl = scp = tmp;
1124 		exit_critical(self);
1125 	}
1126 	/*
1127 	 * Unless the call to setup_schedctl() is surrounded
1128 	 * by enter_critical()/exit_critical(), the address
1129 	 * we are returning could be invalid due to a forkall()
1130 	 * having occurred in another thread.
1131 	 */
1132 	return (scp);
1133 }
1134 
1135 /*
1136  * Interfaces from libsched, incorporated into libc.
1137  * libsched.so.1 is now a filter library onto libc.
1138  */
1139 #pragma weak schedctl_lookup = schedctl_init
1140 schedctl_t *
1141 schedctl_init(void)
1142 {
1143 	volatile sc_shared_t *scp = setup_schedctl();
1144 	return ((scp == NULL)? NULL : (schedctl_t *)&scp->sc_preemptctl);
1145 }
1146 
1147 void
1148 schedctl_exit(void)
1149 {
1150 }
1151 
1152 /*
1153  * Contract private interface for java.
1154  * Set up the schedctl data if it doesn't exist yet.
1155  * Return a pointer to the pointer to the schedctl data.
1156  */
1157 volatile sc_shared_t *volatile *
1158 _thr_schedctl(void)
1159 {
1160 	ulwp_t *self = curthread;
1161 	volatile sc_shared_t *volatile *ptr;
1162 
1163 	if (self->ul_vfork)
1164 		return (NULL);
1165 	if (*(ptr = &self->ul_schedctl) == NULL)
1166 		(void) setup_schedctl();
1167 	return (ptr);
1168 }
1169 
1170 /*
1171  * Block signals and attempt to block preemption.
1172  * no_preempt()/preempt() must be used in pairs but can be nested.
1173  */
1174 void
1175 no_preempt(ulwp_t *self)
1176 {
1177 	volatile sc_shared_t *scp;
1178 
1179 	if (self->ul_preempt++ == 0) {
1180 		enter_critical(self);
1181 		if ((scp = self->ul_schedctl) != NULL ||
1182 		    (scp = setup_schedctl()) != NULL) {
1183 			/*
1184 			 * Save the pre-existing preempt value.
1185 			 */
1186 			self->ul_savpreempt = scp->sc_preemptctl.sc_nopreempt;
1187 			scp->sc_preemptctl.sc_nopreempt = 1;
1188 		}
1189 	}
1190 }
1191 
1192 /*
1193  * Undo the effects of no_preempt().
1194  */
1195 void
1196 preempt(ulwp_t *self)
1197 {
1198 	volatile sc_shared_t *scp;
1199 
1200 	ASSERT(self->ul_preempt > 0);
1201 	if (--self->ul_preempt == 0) {
1202 		if ((scp = self->ul_schedctl) != NULL) {
1203 			/*
1204 			 * Restore the pre-existing preempt value.
1205 			 */
1206 			scp->sc_preemptctl.sc_nopreempt = self->ul_savpreempt;
1207 			if (scp->sc_preemptctl.sc_yield &&
1208 			    scp->sc_preemptctl.sc_nopreempt == 0) {
1209 				yield();
1210 				if (scp->sc_preemptctl.sc_yield) {
1211 					/*
1212 					 * Shouldn't happen.  This is either
1213 					 * a race condition or the thread
1214 					 * just entered the real-time class.
1215 					 */
1216 					yield();
1217 					scp->sc_preemptctl.sc_yield = 0;
1218 				}
1219 			}
1220 		}
1221 		exit_critical(self);
1222 	}
1223 }
1224 
1225 /*
1226  * If a call to preempt() would cause the current thread to yield or to
1227  * take deferred actions in exit_critical(), then unpark the specified
1228  * lwp so it can run while we delay.  Return the original lwpid if the
1229  * unpark was not performed, else return zero.  The tests are a repeat
1230  * of some of the tests in preempt(), above.  This is a statistical
1231  * optimization solely for cond_sleep_queue(), below.
1232  */
1233 static lwpid_t
1234 preempt_unpark(ulwp_t *self, lwpid_t lwpid)
1235 {
1236 	volatile sc_shared_t *scp = self->ul_schedctl;
1237 
1238 	ASSERT(self->ul_preempt == 1 && self->ul_critical > 0);
1239 	if ((scp != NULL && scp->sc_preemptctl.sc_yield) ||
1240 	    (self->ul_curplease && self->ul_critical == 1)) {
1241 		(void) __lwp_unpark(lwpid);
1242 		lwpid = 0;
1243 	}
1244 	return (lwpid);
1245 }
1246 
1247 /*
1248  * Spin for a while (if 'tryhard' is true), trying to grab the lock.
1249  * If this fails, return EBUSY and let the caller deal with it.
1250  * If this succeeds, return 0 with mutex_owner set to curthread.
1251  */
1252 static int
1253 mutex_trylock_adaptive(mutex_t *mp, int tryhard)
1254 {
1255 	ulwp_t *self = curthread;
1256 	int error = EBUSY;
1257 	ulwp_t *ulwp;
1258 	volatile sc_shared_t *scp;
1259 	volatile uint8_t *lockp = (volatile uint8_t *)&mp->mutex_lockw;
1260 	volatile uint64_t *ownerp = (volatile uint64_t *)&mp->mutex_owner;
1261 	uint32_t new_lockword;
1262 	int count = 0;
1263 	int max_count;
1264 	uint8_t max_spinners;
1265 
1266 	ASSERT(!(mp->mutex_type & USYNC_PROCESS));
1267 
1268 	if (MUTEX_OWNED(mp, self))
1269 		return (EBUSY);
1270 
1271 	enter_critical(self);
1272 
1273 	/* short-cut, not definitive (see below) */
1274 	if (mp->mutex_flag & LOCK_NOTRECOVERABLE) {
1275 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1276 		error = ENOTRECOVERABLE;
1277 		goto done;
1278 	}
1279 
1280 	/*
1281 	 * Make one attempt to acquire the lock before
1282 	 * incurring the overhead of the spin loop.
1283 	 */
1284 	if (set_lock_byte(lockp) == 0) {
1285 		*ownerp = (uintptr_t)self;
1286 		error = 0;
1287 		goto done;
1288 	}
1289 	if (!tryhard)
1290 		goto done;
1291 	if (ncpus == 0)
1292 		ncpus = (int)_sysconf(_SC_NPROCESSORS_ONLN);
1293 	if ((max_spinners = self->ul_max_spinners) >= ncpus)
1294 		max_spinners = ncpus - 1;
1295 	max_count = (max_spinners != 0)? self->ul_adaptive_spin : 0;
1296 	if (max_count == 0)
1297 		goto done;
1298 
1299 	/*
1300 	 * This spin loop is unfair to lwps that have already dropped into
1301 	 * the kernel to sleep.  They will starve on a highly-contended mutex.
1302 	 * This is just too bad.  The adaptive spin algorithm is intended
1303 	 * to allow programs with highly-contended locks (that is, broken
1304 	 * programs) to execute with reasonable speed despite their contention.
1305 	 * Being fair would reduce the speed of such programs and well-written
1306 	 * programs will not suffer in any case.
1307 	 */
1308 	if (spinners_incr(&mp->mutex_lockword, max_spinners) == -1)
1309 		goto done;
1310 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
1311 	for (count = 1; ; count++) {
1312 		if (*lockp == 0 && set_lock_byte(lockp) == 0) {
1313 			*ownerp = (uintptr_t)self;
1314 			error = 0;
1315 			break;
1316 		}
1317 		if (count == max_count)
1318 			break;
1319 		SMT_PAUSE();
1320 		/*
1321 		 * Stop spinning if the mutex owner is not running on
1322 		 * a processor; it will not drop the lock any time soon
1323 		 * and we would just be wasting time to keep spinning.
1324 		 *
1325 		 * Note that we are looking at another thread (ulwp_t)
1326 		 * without ensuring that the other thread does not exit.
1327 		 * The scheme relies on ulwp_t structures never being
1328 		 * deallocated by the library (the library employs a free
1329 		 * list of ulwp_t structs that are reused when new threads
1330 		 * are created) and on schedctl shared memory never being
1331 		 * deallocated once created via __schedctl().
1332 		 *
1333 		 * Thus, the worst that can happen when the spinning thread
1334 		 * looks at the owner's schedctl data is that it is looking
1335 		 * at some other thread's schedctl data.  This almost never
1336 		 * happens and is benign when it does.
1337 		 */
1338 		if ((ulwp = (ulwp_t *)(uintptr_t)*ownerp) != NULL &&
1339 		    ((scp = ulwp->ul_schedctl) == NULL ||
1340 		    scp->sc_state != SC_ONPROC))
1341 			break;
1342 	}
1343 	new_lockword = spinners_decr(&mp->mutex_lockword);
1344 	if (error && (new_lockword & (LOCKMASK | SPINNERMASK)) == 0) {
1345 		/*
1346 		 * We haven't yet acquired the lock, the lock
1347 		 * is free, and there are no other spinners.
1348 		 * Make one final attempt to acquire the lock.
1349 		 *
1350 		 * This isn't strictly necessary since mutex_lock_queue()
1351 		 * (the next action this thread will take if it doesn't
1352 		 * acquire the lock here) makes one attempt to acquire
1353 		 * the lock before putting the thread to sleep.
1354 		 *
1355 		 * If the next action for this thread (on failure here)
1356 		 * were not to call mutex_lock_queue(), this would be
1357 		 * necessary for correctness, to avoid ending up with an
1358 		 * unheld mutex with waiters but no one to wake them up.
1359 		 */
1360 		if (set_lock_byte(lockp) == 0) {
1361 			*ownerp = (uintptr_t)self;
1362 			error = 0;
1363 		}
1364 		count++;
1365 	}
1366 
1367 done:
1368 	if (error == 0 && (mp->mutex_flag & LOCK_NOTRECOVERABLE)) {
1369 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1370 		/*
1371 		 * We shouldn't own the mutex.
1372 		 * Just clear the lock; everyone has already been waked up.
1373 		 */
1374 		*ownerp = 0;
1375 		(void) clear_lockbyte(&mp->mutex_lockword);
1376 		error = ENOTRECOVERABLE;
1377 	}
1378 
1379 	exit_critical(self);
1380 
1381 	if (error) {
1382 		if (count) {
1383 			DTRACE_PROBE3(plockstat, mutex__spun, mp, 0, count);
1384 		}
1385 		if (error != EBUSY) {
1386 			DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1387 		}
1388 	} else {
1389 		if (count) {
1390 			DTRACE_PROBE3(plockstat, mutex__spun, mp, 1, count);
1391 		}
1392 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
1393 		if (mp->mutex_flag & LOCK_OWNERDEAD) {
1394 			ASSERT(mp->mutex_type & LOCK_ROBUST);
1395 			error = EOWNERDEAD;
1396 		}
1397 	}
1398 
1399 	return (error);
1400 }
1401 
1402 /*
1403  * Same as mutex_trylock_adaptive(), except specifically for queue locks.
1404  * The owner field is not set here; the caller (spin_lock_set()) sets it.
1405  */
1406 static int
1407 mutex_queuelock_adaptive(mutex_t *mp)
1408 {
1409 	ulwp_t *ulwp;
1410 	volatile sc_shared_t *scp;
1411 	volatile uint8_t *lockp;
1412 	volatile uint64_t *ownerp;
1413 	int count = curthread->ul_queue_spin;
1414 
1415 	ASSERT(mp->mutex_type == USYNC_THREAD);
1416 
1417 	if (count == 0)
1418 		return (EBUSY);
1419 
1420 	lockp = (volatile uint8_t *)&mp->mutex_lockw;
1421 	ownerp = (volatile uint64_t *)&mp->mutex_owner;
1422 	while (--count >= 0) {
1423 		if (*lockp == 0 && set_lock_byte(lockp) == 0)
1424 			return (0);
1425 		SMT_PAUSE();
1426 		if ((ulwp = (ulwp_t *)(uintptr_t)*ownerp) != NULL &&
1427 		    ((scp = ulwp->ul_schedctl) == NULL ||
1428 		    scp->sc_state != SC_ONPROC))
1429 			break;
1430 	}
1431 
1432 	return (EBUSY);
1433 }
1434 
1435 /*
1436  * Like mutex_trylock_adaptive(), but for process-shared mutexes.
1437  * Spin for a while (if 'tryhard' is true), trying to grab the lock.
1438  * If this fails, return EBUSY and let the caller deal with it.
1439  * If this succeeds, return 0 with mutex_owner set to curthread
1440  * and mutex_ownerpid set to the current pid.
1441  */
1442 static int
1443 mutex_trylock_process(mutex_t *mp, int tryhard)
1444 {
1445 	ulwp_t *self = curthread;
1446 	uberdata_t *udp = self->ul_uberdata;
1447 	int error = EBUSY;
1448 	volatile uint64_t *lockp = (volatile uint64_t *)&mp->mutex_lockword64;
1449 	uint32_t new_lockword;
1450 	int count = 0;
1451 	int max_count;
1452 	uint8_t max_spinners;
1453 
1454 #if defined(__sparc) && !defined(_LP64)
1455 	/* horrible hack, necessary only on 32-bit sparc */
1456 	int fix_alignment_problem =
1457 	    (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
1458 	    self->ul_misaligned && !(mp->mutex_type & LOCK_ROBUST));
1459 #endif
1460 
1461 	ASSERT(mp->mutex_type & USYNC_PROCESS);
1462 
1463 	if (shared_mutex_held(mp))
1464 		return (EBUSY);
1465 
1466 	enter_critical(self);
1467 
1468 	/* short-cut, not definitive (see below) */
1469 	if (mp->mutex_flag & LOCK_NOTRECOVERABLE) {
1470 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1471 		error = ENOTRECOVERABLE;
1472 		goto done;
1473 	}
1474 
1475 	/*
1476 	 * Make one attempt to acquire the lock before
1477 	 * incurring the overhead of the spin loop.
1478 	 */
1479 #if defined(__sparc) && !defined(_LP64)
1480 	/* horrible hack, necessary only on 32-bit sparc */
1481 	if (fix_alignment_problem) {
1482 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
1483 			mp->mutex_ownerpid = udp->pid;
1484 			mp->mutex_owner = (uintptr_t)self;
1485 			error = 0;
1486 			goto done;
1487 		}
1488 	} else
1489 #endif
1490 	if (set_lock_byte64(lockp, udp->pid) == 0) {
1491 		mp->mutex_owner = (uintptr_t)self;
1492 		/* mp->mutex_ownerpid was set by set_lock_byte64() */
1493 		error = 0;
1494 		goto done;
1495 	}
1496 	if (!tryhard)
1497 		goto done;
1498 	if (ncpus == 0)
1499 		ncpus = (int)_sysconf(_SC_NPROCESSORS_ONLN);
1500 	if ((max_spinners = self->ul_max_spinners) >= ncpus)
1501 		max_spinners = ncpus - 1;
1502 	max_count = (max_spinners != 0)? self->ul_adaptive_spin : 0;
1503 	if (max_count == 0)
1504 		goto done;
1505 
1506 	/*
1507 	 * This is a process-shared mutex.
1508 	 * We cannot know if the owner is running on a processor.
1509 	 * We just spin and hope that it is on a processor.
1510 	 */
1511 	if (spinners_incr(&mp->mutex_lockword, max_spinners) == -1)
1512 		goto done;
1513 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
1514 	for (count = 1; ; count++) {
1515 #if defined(__sparc) && !defined(_LP64)
1516 		/* horrible hack, necessary only on 32-bit sparc */
1517 		if (fix_alignment_problem) {
1518 			if ((*lockp & LOCKMASK64) == 0 &&
1519 			    set_lock_byte(&mp->mutex_lockw) == 0) {
1520 				mp->mutex_ownerpid = udp->pid;
1521 				mp->mutex_owner = (uintptr_t)self;
1522 				error = 0;
1523 				break;
1524 			}
1525 		} else
1526 #endif
1527 		if ((*lockp & LOCKMASK64) == 0 &&
1528 		    set_lock_byte64(lockp, udp->pid) == 0) {
1529 			mp->mutex_owner = (uintptr_t)self;
1530 			/* mp->mutex_ownerpid was set by set_lock_byte64() */
1531 			error = 0;
1532 			break;
1533 		}
1534 		if (count == max_count)
1535 			break;
1536 		SMT_PAUSE();
1537 	}
1538 	new_lockword = spinners_decr(&mp->mutex_lockword);
1539 	if (error && (new_lockword & (LOCKMASK | SPINNERMASK)) == 0) {
1540 		/*
1541 		 * We haven't yet acquired the lock, the lock
1542 		 * is free, and there are no other spinners.
1543 		 * Make one final attempt to acquire the lock.
1544 		 *
1545 		 * This isn't strictly necessary since mutex_lock_kernel()
1546 		 * (the next action this thread will take if it doesn't
1547 		 * acquire the lock here) makes one attempt to acquire
1548 		 * the lock before putting the thread to sleep.
1549 		 *
1550 		 * If the next action for this thread (on failure here)
1551 		 * were not to call mutex_lock_kernel(), this would be
1552 		 * necessary for correctness, to avoid ending up with an
1553 		 * unheld mutex with waiters but no one to wake them up.
1554 		 */
1555 #if defined(__sparc) && !defined(_LP64)
1556 		/* horrible hack, necessary only on 32-bit sparc */
1557 		if (fix_alignment_problem) {
1558 			if (set_lock_byte(&mp->mutex_lockw) == 0) {
1559 				mp->mutex_ownerpid = udp->pid;
1560 				mp->mutex_owner = (uintptr_t)self;
1561 				error = 0;
1562 			}
1563 		} else
1564 #endif
1565 		if (set_lock_byte64(lockp, udp->pid) == 0) {
1566 			mp->mutex_owner = (uintptr_t)self;
1567 			/* mp->mutex_ownerpid was set by set_lock_byte64() */
1568 			error = 0;
1569 		}
1570 		count++;
1571 	}
1572 
1573 done:
1574 	if (error == 0 && (mp->mutex_flag & LOCK_NOTRECOVERABLE)) {
1575 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1576 		/*
1577 		 * We shouldn't own the mutex.
1578 		 * Just clear the lock; everyone has already been waked up.
1579 		 */
1580 		mp->mutex_owner = 0;
1581 		/* mp->mutex_ownerpid is cleared by clear_lockbyte64() */
1582 		(void) clear_lockbyte64(&mp->mutex_lockword64);
1583 		error = ENOTRECOVERABLE;
1584 	}
1585 
1586 	exit_critical(self);
1587 
1588 	if (error) {
1589 		if (count) {
1590 			DTRACE_PROBE3(plockstat, mutex__spun, mp, 0, count);
1591 		}
1592 		if (error != EBUSY) {
1593 			DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1594 		}
1595 	} else {
1596 		if (count) {
1597 			DTRACE_PROBE3(plockstat, mutex__spun, mp, 1, count);
1598 		}
1599 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
1600 		if (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED)) {
1601 			ASSERT(mp->mutex_type & LOCK_ROBUST);
1602 			if (mp->mutex_flag & LOCK_OWNERDEAD)
1603 				error = EOWNERDEAD;
1604 			else if (mp->mutex_type & USYNC_PROCESS_ROBUST)
1605 				error = ELOCKUNMAPPED;
1606 			else
1607 				error = EOWNERDEAD;
1608 		}
1609 	}
1610 
1611 	return (error);
1612 }
1613 
1614 /*
1615  * Mutex wakeup code for releasing a USYNC_THREAD mutex.
1616  * Returns the lwpid of the thread that was dequeued, if any.
1617  * The caller of mutex_wakeup() must call __lwp_unpark(lwpid)
1618  * to wake up the specified lwp.
1619  */
1620 static lwpid_t
1621 mutex_wakeup(mutex_t *mp)
1622 {
1623 	lwpid_t lwpid = 0;
1624 	int more;
1625 	queue_head_t *qp;
1626 	ulwp_t *ulwp;
1627 
1628 	/*
1629 	 * Dequeue a waiter from the sleep queue.  Don't touch the mutex
1630 	 * waiters bit if no one was found on the queue because the mutex
1631 	 * might have been deallocated or reallocated for another purpose.
1632 	 */
1633 	qp = queue_lock(mp, MX);
1634 	if ((ulwp = dequeue(qp, &more)) != NULL) {
1635 		lwpid = ulwp->ul_lwpid;
1636 		mp->mutex_waiters = more;
1637 	}
1638 	queue_unlock(qp);
1639 	return (lwpid);
1640 }
1641 
1642 /*
1643  * Mutex wakeup code for releasing all waiters on a USYNC_THREAD mutex.
1644  */
1645 static void
1646 mutex_wakeup_all(mutex_t *mp)
1647 {
1648 	queue_head_t *qp;
1649 	queue_root_t *qrp;
1650 	int nlwpid = 0;
1651 	int maxlwps = MAXLWPS;
1652 	ulwp_t *ulwp;
1653 	lwpid_t buffer[MAXLWPS];
1654 	lwpid_t *lwpid = buffer;
1655 
1656 	/*
1657 	 * Walk the list of waiters and prepare to wake up all of them.
1658 	 * The waiters flag has already been cleared from the mutex.
1659 	 *
1660 	 * We keep track of lwpids that are to be unparked in lwpid[].
1661 	 * __lwp_unpark_all() is called to unpark all of them after
1662 	 * they have been removed from the sleep queue and the sleep
1663 	 * queue lock has been dropped.  If we run out of space in our
1664 	 * on-stack buffer, we need to allocate more but we can't call
1665 	 * lmalloc() because we are holding a queue lock when the overflow
1666 	 * occurs and lmalloc() acquires a lock.  We can't use alloca()
1667 	 * either because the application may have allocated a small
1668 	 * stack and we don't want to overrun the stack.  So we call
1669 	 * alloc_lwpids() to allocate a bigger buffer using the mmap()
1670 	 * system call directly since that path acquires no locks.
1671 	 */
1672 	qp = queue_lock(mp, MX);
1673 	for (;;) {
1674 		if ((qrp = qp->qh_root) == NULL ||
1675 		    (ulwp = qrp->qr_head) == NULL)
1676 			break;
1677 		ASSERT(ulwp->ul_wchan == mp);
1678 		queue_unlink(qp, &qrp->qr_head, NULL);
1679 		ulwp->ul_sleepq = NULL;
1680 		ulwp->ul_wchan = NULL;
1681 		if (nlwpid == maxlwps)
1682 			lwpid = alloc_lwpids(lwpid, &nlwpid, &maxlwps);
1683 		lwpid[nlwpid++] = ulwp->ul_lwpid;
1684 	}
1685 
1686 	if (nlwpid == 0) {
1687 		queue_unlock(qp);
1688 	} else {
1689 		mp->mutex_waiters = 0;
1690 		no_preempt(curthread);
1691 		queue_unlock(qp);
1692 		if (nlwpid == 1)
1693 			(void) __lwp_unpark(lwpid[0]);
1694 		else
1695 			(void) __lwp_unpark_all(lwpid, nlwpid);
1696 		preempt(curthread);
1697 	}
1698 
1699 	if (lwpid != buffer)
1700 		(void) munmap((caddr_t)lwpid, maxlwps * sizeof (lwpid_t));
1701 }
1702 
1703 /*
1704  * Release a process-private mutex.
1705  * As an optimization, if there are waiters but there are also spinners
1706  * attempting to acquire the mutex, then don't bother waking up a waiter;
1707  * one of the spinners will acquire the mutex soon and it would be a waste
1708  * of resources to wake up some thread just to have it spin for a while
1709  * and then possibly go back to sleep.  See mutex_trylock_adaptive().
1710  */
1711 static lwpid_t
1712 mutex_unlock_queue(mutex_t *mp, int release_all)
1713 {
1714 	ulwp_t *self = curthread;
1715 	lwpid_t lwpid = 0;
1716 	uint32_t old_lockword;
1717 
1718 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
1719 	sigoff(self);
1720 	mp->mutex_owner = 0;
1721 	old_lockword = clear_lockbyte(&mp->mutex_lockword);
1722 	if ((old_lockword & WAITERMASK) &&
1723 	    (release_all || (old_lockword & SPINNERMASK) == 0)) {
1724 		no_preempt(self);	/* ensure a prompt wakeup */
1725 		if (release_all)
1726 			mutex_wakeup_all(mp);
1727 		else
1728 			lwpid = mutex_wakeup(mp);
1729 		if (lwpid == 0)
1730 			preempt(self);
1731 	}
1732 	sigon(self);
1733 	return (lwpid);
1734 }
1735 
1736 /*
1737  * Like mutex_unlock_queue(), but for process-shared mutexes.
1738  */
1739 static void
1740 mutex_unlock_process(mutex_t *mp, int release_all)
1741 {
1742 	ulwp_t *self = curthread;
1743 	uint64_t old_lockword64;
1744 
1745 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
1746 	sigoff(self);
1747 	mp->mutex_owner = 0;
1748 #if defined(__sparc) && !defined(_LP64)
1749 	/* horrible hack, necessary only on 32-bit sparc */
1750 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
1751 	    self->ul_misaligned && !(mp->mutex_type & LOCK_ROBUST)) {
1752 		uint32_t old_lockword;
1753 		mp->mutex_ownerpid = 0;
1754 		old_lockword = clear_lockbyte(&mp->mutex_lockword);
1755 		if ((old_lockword & WAITERMASK) &&
1756 		    (release_all || (old_lockword & SPINNERMASK) == 0)) {
1757 			no_preempt(self);	/* ensure a prompt wakeup */
1758 			(void) ___lwp_mutex_wakeup(mp, release_all);
1759 			preempt(self);
1760 		}
1761 		sigon(self);
1762 		return;
1763 	}
1764 #endif
1765 	/* mp->mutex_ownerpid is cleared by clear_lockbyte64() */
1766 	old_lockword64 = clear_lockbyte64(&mp->mutex_lockword64);
1767 	if ((old_lockword64 & WAITERMASK64) &&
1768 	    (release_all || (old_lockword64 & SPINNERMASK64) == 0)) {
1769 		no_preempt(self);	/* ensure a prompt wakeup */
1770 		(void) ___lwp_mutex_wakeup(mp, release_all);
1771 		preempt(self);
1772 	}
1773 	sigon(self);
1774 }
1775 
1776 void
1777 stall(void)
1778 {
1779 	for (;;)
1780 		(void) mutex_lock_kernel(&stall_mutex, NULL, NULL);
1781 }
1782 
1783 /*
1784  * Acquire a USYNC_THREAD mutex via user-level sleep queues.
1785  * We failed set_lock_byte(&mp->mutex_lockw) before coming here.
1786  * If successful, returns with mutex_owner set correctly.
1787  */
1788 int
1789 mutex_lock_queue(ulwp_t *self, tdb_mutex_stats_t *msp, mutex_t *mp,
1790 	timespec_t *tsp)
1791 {
1792 	uberdata_t *udp = curthread->ul_uberdata;
1793 	queue_head_t *qp;
1794 	hrtime_t begin_sleep;
1795 	int error = 0;
1796 
1797 	self->ul_sp = stkptr();
1798 	if (__td_event_report(self, TD_SLEEP, udp)) {
1799 		self->ul_wchan = mp;
1800 		self->ul_td_evbuf.eventnum = TD_SLEEP;
1801 		self->ul_td_evbuf.eventdata = mp;
1802 		tdb_event(TD_SLEEP, udp);
1803 	}
1804 	if (msp) {
1805 		tdb_incr(msp->mutex_sleep);
1806 		begin_sleep = gethrtime();
1807 	}
1808 
1809 	DTRACE_PROBE1(plockstat, mutex__block, mp);
1810 
1811 	/*
1812 	 * Put ourself on the sleep queue, and while we are
1813 	 * unable to grab the lock, go park in the kernel.
1814 	 * Take ourself off the sleep queue after we acquire the lock.
1815 	 * The waiter bit can be set/cleared only while holding the queue lock.
1816 	 */
1817 	qp = queue_lock(mp, MX);
1818 	enqueue(qp, self, 0);
1819 	mp->mutex_waiters = 1;
1820 	for (;;) {
1821 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
1822 			mp->mutex_owner = (uintptr_t)self;
1823 			mp->mutex_waiters = dequeue_self(qp);
1824 			break;
1825 		}
1826 		set_parking_flag(self, 1);
1827 		queue_unlock(qp);
1828 		/*
1829 		 * __lwp_park() will return the residual time in tsp
1830 		 * if we are unparked before the timeout expires.
1831 		 */
1832 		error = __lwp_park(tsp, 0);
1833 		set_parking_flag(self, 0);
1834 		/*
1835 		 * We could have taken a signal or suspended ourself.
1836 		 * If we did, then we removed ourself from the queue.
1837 		 * Someone else may have removed us from the queue
1838 		 * as a consequence of mutex_unlock().  We may have
1839 		 * gotten a timeout from __lwp_park().  Or we may still
1840 		 * be on the queue and this is just a spurious wakeup.
1841 		 */
1842 		qp = queue_lock(mp, MX);
1843 		if (self->ul_sleepq == NULL) {
1844 			if (error) {
1845 				mp->mutex_waiters = queue_waiter(qp)? 1 : 0;
1846 				if (error != EINTR)
1847 					break;
1848 				error = 0;
1849 			}
1850 			if (set_lock_byte(&mp->mutex_lockw) == 0) {
1851 				mp->mutex_owner = (uintptr_t)self;
1852 				break;
1853 			}
1854 			enqueue(qp, self, 0);
1855 			mp->mutex_waiters = 1;
1856 		}
1857 		ASSERT(self->ul_sleepq == qp &&
1858 		    self->ul_qtype == MX &&
1859 		    self->ul_wchan == mp);
1860 		if (error) {
1861 			if (error != EINTR) {
1862 				mp->mutex_waiters = dequeue_self(qp);
1863 				break;
1864 			}
1865 			error = 0;
1866 		}
1867 	}
1868 	ASSERT(self->ul_sleepq == NULL && self->ul_link == NULL &&
1869 	    self->ul_wchan == NULL);
1870 	self->ul_sp = 0;
1871 
1872 	ASSERT(error == 0 || error == EINVAL || error == ETIME);
1873 
1874 	if (error == 0 && (mp->mutex_flag & LOCK_NOTRECOVERABLE)) {
1875 		ASSERT(mp->mutex_type & LOCK_ROBUST);
1876 		/*
1877 		 * We shouldn't own the mutex.
1878 		 * Just clear the lock; everyone has already been waked up.
1879 		 */
1880 		mp->mutex_owner = 0;
1881 		(void) clear_lockbyte(&mp->mutex_lockword);
1882 		error = ENOTRECOVERABLE;
1883 	}
1884 
1885 	queue_unlock(qp);
1886 
1887 	if (msp)
1888 		msp->mutex_sleep_time += gethrtime() - begin_sleep;
1889 
1890 	if (error) {
1891 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 0);
1892 		DTRACE_PROBE2(plockstat, mutex__error, mp, error);
1893 	} else {
1894 		DTRACE_PROBE2(plockstat, mutex__blocked, mp, 1);
1895 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
1896 		if (mp->mutex_flag & LOCK_OWNERDEAD) {
1897 			ASSERT(mp->mutex_type & LOCK_ROBUST);
1898 			error = EOWNERDEAD;
1899 		}
1900 	}
1901 
1902 	return (error);
1903 }
1904 
1905 static int
1906 mutex_recursion(mutex_t *mp, int mtype, int try)
1907 {
1908 	ASSERT(mutex_held(mp));
1909 	ASSERT(mtype & (LOCK_RECURSIVE|LOCK_ERRORCHECK));
1910 	ASSERT(try == MUTEX_TRY || try == MUTEX_LOCK);
1911 
1912 	if (mtype & LOCK_RECURSIVE) {
1913 		if (mp->mutex_rcount == RECURSION_MAX) {
1914 			DTRACE_PROBE2(plockstat, mutex__error, mp, EAGAIN);
1915 			return (EAGAIN);
1916 		}
1917 		mp->mutex_rcount++;
1918 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 1, 0);
1919 		return (0);
1920 	}
1921 	if (try == MUTEX_LOCK) {
1922 		DTRACE_PROBE2(plockstat, mutex__error, mp, EDEADLK);
1923 		return (EDEADLK);
1924 	}
1925 	return (EBUSY);
1926 }
1927 
1928 /*
1929  * Register this USYNC_PROCESS|LOCK_ROBUST mutex with the kernel so
1930  * it can apply LOCK_OWNERDEAD|LOCK_UNMAPPED if it becomes necessary.
1931  * We use tdb_hash_lock here and in the synch object tracking code in
1932  * the tdb_agent.c file.  There is no conflict between these two usages.
1933  */
1934 void
1935 register_lock(mutex_t *mp)
1936 {
1937 	uberdata_t *udp = curthread->ul_uberdata;
1938 	uint_t hash = LOCK_HASH(mp);
1939 	robust_t *rlp;
1940 	robust_t *invalid;
1941 	robust_t **rlpp;
1942 	robust_t **table;
1943 
1944 	if ((table = udp->robustlocks) == NULL) {
1945 		lmutex_lock(&udp->tdb_hash_lock);
1946 		if ((table = udp->robustlocks) == NULL) {
1947 			table = lmalloc(LOCKHASHSZ * sizeof (robust_t *));
1948 			membar_producer();
1949 			udp->robustlocks = table;
1950 		}
1951 		lmutex_unlock(&udp->tdb_hash_lock);
1952 	}
1953 	membar_consumer();
1954 
1955 	/*
1956 	 * First search the registered table with no locks held.
1957 	 * This is safe because the table never shrinks
1958 	 * and we can only get a false negative.
1959 	 */
1960 	for (rlp = table[hash]; rlp != NULL; rlp = rlp->robust_next) {
1961 		if (rlp->robust_lock == mp)	/* already registered */
1962 			return;
1963 	}
1964 
1965 	/*
1966 	 * The lock was not found.
1967 	 * Repeat the operation with tdb_hash_lock held.
1968 	 */
1969 	lmutex_lock(&udp->tdb_hash_lock);
1970 
1971 	invalid = NULL;
1972 	for (rlpp = &table[hash];
1973 	    (rlp = *rlpp) != NULL;
1974 	    rlpp = &rlp->robust_next) {
1975 		if (rlp->robust_lock == mp) {	/* already registered */
1976 			lmutex_unlock(&udp->tdb_hash_lock);
1977 			return;
1978 		}
1979 		/* remember the first invalid entry, if any */
1980 		if (rlp->robust_lock == INVALID_ADDR && invalid == NULL)
1981 			invalid = rlp;
1982 	}
1983 
1984 	/*
1985 	 * The lock has never been registered.
1986 	 * Add it to the table and register it now.
1987 	 */
1988 	if ((rlp = invalid) != NULL) {
1989 		/*
1990 		 * Reuse the invalid entry we found above.
1991 		 * The linkages are still correct.
1992 		 */
1993 		rlp->robust_lock = mp;
1994 		membar_producer();
1995 	} else {
1996 		/*
1997 		 * Allocate a new entry and add it to
1998 		 * the hash table and to the global list.
1999 		 */
2000 		rlp = lmalloc(sizeof (*rlp));
2001 		rlp->robust_lock = mp;
2002 		rlp->robust_next = NULL;
2003 		rlp->robust_list = udp->robustlist;
2004 		udp->robustlist = rlp;
2005 		membar_producer();
2006 		*rlpp = rlp;
2007 	}
2008 
2009 	lmutex_unlock(&udp->tdb_hash_lock);
2010 
2011 	(void) ___lwp_mutex_register(mp, &rlp->robust_lock);
2012 }
2013 
2014 /*
2015  * This is called in the child of fork()/forkall() to start over
2016  * with a clean slate.  (Each process must register its own locks.)
2017  * No locks are needed because all other threads are suspended or gone.
2018  */
2019 void
2020 unregister_locks(void)
2021 {
2022 	uberdata_t *udp = curthread->ul_uberdata;
2023 	robust_t **table;
2024 	robust_t *rlp;
2025 	robust_t *next;
2026 
2027 	/*
2028 	 * Do this first, before calling lfree().
2029 	 */
2030 	table = udp->robustlocks;
2031 	udp->robustlocks = NULL;
2032 	rlp = udp->robustlist;
2033 	udp->robustlist = NULL;
2034 
2035 	/*
2036 	 * Do this by traversing the global list, not the hash table.
2037 	 */
2038 	while (rlp != NULL) {
2039 		next = rlp->robust_list;
2040 		lfree(rlp, sizeof (*rlp));
2041 		rlp = next;
2042 	}
2043 	if (table != NULL)
2044 		lfree(table, LOCKHASHSZ * sizeof (robust_t *));
2045 }
2046 
2047 /*
2048  * Returns with mutex_owner set correctly.
2049  */
2050 int
2051 mutex_lock_internal(mutex_t *mp, timespec_t *tsp, int try)
2052 {
2053 	ulwp_t *self = curthread;
2054 	uberdata_t *udp = self->ul_uberdata;
2055 	int mtype = mp->mutex_type;
2056 	tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2057 	int error = 0;
2058 	int noceil = try & MUTEX_NOCEIL;
2059 	uint8_t ceil;
2060 	int myprio;
2061 
2062 	try &= ~MUTEX_NOCEIL;
2063 	ASSERT(try == MUTEX_TRY || try == MUTEX_LOCK);
2064 
2065 	if (!self->ul_schedctl_called)
2066 		(void) setup_schedctl();
2067 
2068 	if (msp && try == MUTEX_TRY)
2069 		tdb_incr(msp->mutex_try);
2070 
2071 	if ((mtype & (LOCK_RECURSIVE|LOCK_ERRORCHECK)) && mutex_held(mp))
2072 		return (mutex_recursion(mp, mtype, try));
2073 
2074 	if (self->ul_error_detection && try == MUTEX_LOCK &&
2075 	    tsp == NULL && mutex_held(mp))
2076 		lock_error(mp, "mutex_lock", NULL, NULL);
2077 
2078 	if ((mtype & LOCK_PRIO_PROTECT) && noceil == 0) {
2079 		update_sched(self);
2080 		if (self->ul_cid != self->ul_rtclassid) {
2081 			DTRACE_PROBE2(plockstat, mutex__error, mp, EPERM);
2082 			return (EPERM);
2083 		}
2084 		ceil = mp->mutex_ceiling;
2085 		myprio = self->ul_epri? self->ul_epri : self->ul_pri;
2086 		if (myprio > ceil) {
2087 			DTRACE_PROBE2(plockstat, mutex__error, mp, EINVAL);
2088 			return (EINVAL);
2089 		}
2090 		if ((error = _ceil_mylist_add(mp)) != 0) {
2091 			DTRACE_PROBE2(plockstat, mutex__error, mp, error);
2092 			return (error);
2093 		}
2094 		if (myprio < ceil)
2095 			_ceil_prio_inherit(ceil);
2096 	}
2097 
2098 	if ((mtype & (USYNC_PROCESS | LOCK_ROBUST))
2099 	    == (USYNC_PROCESS | LOCK_ROBUST))
2100 		register_lock(mp);
2101 
2102 	if (mtype & LOCK_PRIO_INHERIT) {
2103 		/* go straight to the kernel */
2104 		if (try == MUTEX_TRY)
2105 			error = mutex_trylock_kernel(mp);
2106 		else	/* MUTEX_LOCK */
2107 			error = mutex_lock_kernel(mp, tsp, msp);
2108 		/*
2109 		 * The kernel never sets or clears the lock byte
2110 		 * for LOCK_PRIO_INHERIT mutexes.
2111 		 * Set it here for consistency.
2112 		 */
2113 		switch (error) {
2114 		case 0:
2115 			self->ul_pilocks++;
2116 			mp->mutex_lockw = LOCKSET;
2117 			break;
2118 		case EOWNERDEAD:
2119 		case ELOCKUNMAPPED:
2120 			self->ul_pilocks++;
2121 			mp->mutex_lockw = LOCKSET;
2122 			/* FALLTHROUGH */
2123 		case ENOTRECOVERABLE:
2124 			ASSERT(mtype & LOCK_ROBUST);
2125 			break;
2126 		case EDEADLK:
2127 			if (try == MUTEX_TRY) {
2128 				error = EBUSY;
2129 			} else if (tsp != NULL) {	/* simulate a timeout */
2130 				/*
2131 				 * Note: mutex_timedlock() never returns EINTR.
2132 				 */
2133 				timespec_t ts = *tsp;
2134 				timespec_t rts;
2135 
2136 				while (__nanosleep(&ts, &rts) == EINTR)
2137 					ts = rts;
2138 				error = ETIME;
2139 			} else {		/* simulate a deadlock */
2140 				stall();
2141 			}
2142 			break;
2143 		}
2144 	} else if (mtype & USYNC_PROCESS) {
2145 		error = mutex_trylock_process(mp, try == MUTEX_LOCK);
2146 		if (error == EBUSY && try == MUTEX_LOCK)
2147 			error = mutex_lock_kernel(mp, tsp, msp);
2148 	} else {	/* USYNC_THREAD */
2149 		error = mutex_trylock_adaptive(mp, try == MUTEX_LOCK);
2150 		if (error == EBUSY && try == MUTEX_LOCK)
2151 			error = mutex_lock_queue(self, msp, mp, tsp);
2152 	}
2153 
2154 	switch (error) {
2155 	case 0:
2156 	case EOWNERDEAD:
2157 	case ELOCKUNMAPPED:
2158 		if (mtype & LOCK_ROBUST)
2159 			remember_lock(mp);
2160 		if (msp)
2161 			record_begin_hold(msp);
2162 		break;
2163 	default:
2164 		if ((mtype & LOCK_PRIO_PROTECT) && noceil == 0) {
2165 			(void) _ceil_mylist_del(mp);
2166 			if (myprio < ceil)
2167 				_ceil_prio_waive();
2168 		}
2169 		if (try == MUTEX_TRY) {
2170 			if (msp)
2171 				tdb_incr(msp->mutex_try_fail);
2172 			if (__td_event_report(self, TD_LOCK_TRY, udp)) {
2173 				self->ul_td_evbuf.eventnum = TD_LOCK_TRY;
2174 				tdb_event(TD_LOCK_TRY, udp);
2175 			}
2176 		}
2177 		break;
2178 	}
2179 
2180 	return (error);
2181 }
2182 
2183 int
2184 fast_process_lock(mutex_t *mp, timespec_t *tsp, int mtype, int try)
2185 {
2186 	ulwp_t *self = curthread;
2187 	uberdata_t *udp = self->ul_uberdata;
2188 
2189 	/*
2190 	 * We know that USYNC_PROCESS is set in mtype and that
2191 	 * zero, one, or both of the flags LOCK_RECURSIVE and
2192 	 * LOCK_ERRORCHECK are set, and that no other flags are set.
2193 	 */
2194 	ASSERT((mtype & ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0);
2195 	enter_critical(self);
2196 #if defined(__sparc) && !defined(_LP64)
2197 	/* horrible hack, necessary only on 32-bit sparc */
2198 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2199 	    self->ul_misaligned) {
2200 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2201 			mp->mutex_ownerpid = udp->pid;
2202 			mp->mutex_owner = (uintptr_t)self;
2203 			exit_critical(self);
2204 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2205 			return (0);
2206 		}
2207 	} else
2208 #endif
2209 	if (set_lock_byte64(&mp->mutex_lockword64, udp->pid) == 0) {
2210 		mp->mutex_owner = (uintptr_t)self;
2211 		/* mp->mutex_ownerpid was set by set_lock_byte64() */
2212 		exit_critical(self);
2213 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2214 		return (0);
2215 	}
2216 	exit_critical(self);
2217 
2218 	if ((mtype & (LOCK_RECURSIVE|LOCK_ERRORCHECK)) && shared_mutex_held(mp))
2219 		return (mutex_recursion(mp, mtype, try));
2220 
2221 	if (try == MUTEX_LOCK) {
2222 		if (mutex_trylock_process(mp, 1) == 0)
2223 			return (0);
2224 		return (mutex_lock_kernel(mp, tsp, NULL));
2225 	}
2226 
2227 	if (__td_event_report(self, TD_LOCK_TRY, udp)) {
2228 		self->ul_td_evbuf.eventnum = TD_LOCK_TRY;
2229 		tdb_event(TD_LOCK_TRY, udp);
2230 	}
2231 	return (EBUSY);
2232 }
2233 
2234 static int
2235 mutex_lock_impl(mutex_t *mp, timespec_t *tsp)
2236 {
2237 	ulwp_t *self = curthread;
2238 	int mtype = mp->mutex_type;
2239 	uberflags_t *gflags;
2240 
2241 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2242 	    self->ul_error_detection && self->ul_misaligned == 0)
2243 		lock_error(mp, "mutex_lock", NULL, "mutex is misaligned");
2244 
2245 	/*
2246 	 * Optimize the case of USYNC_THREAD, including
2247 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2248 	 * no error detection, no lock statistics,
2249 	 * and the process has only a single thread.
2250 	 * (Most likely a traditional single-threaded application.)
2251 	 */
2252 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2253 	    self->ul_uberdata->uberflags.uf_all) == 0) {
2254 		/*
2255 		 * Only one thread exists so we don't need an atomic operation.
2256 		 * We do, however, need to protect against signals.
2257 		 */
2258 		if (mp->mutex_lockw == 0) {
2259 			sigoff(self);
2260 			mp->mutex_lockw = LOCKSET;
2261 			mp->mutex_owner = (uintptr_t)self;
2262 			sigon(self);
2263 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2264 			return (0);
2265 		}
2266 		if (mtype && MUTEX_OWNER(mp) == self)
2267 			return (mutex_recursion(mp, mtype, MUTEX_LOCK));
2268 		/*
2269 		 * We have reached a deadlock, probably because the
2270 		 * process is executing non-async-signal-safe code in
2271 		 * a signal handler and is attempting to acquire a lock
2272 		 * that it already owns.  This is not surprising, given
2273 		 * bad programming practices over the years that has
2274 		 * resulted in applications calling printf() and such
2275 		 * in their signal handlers.  Unless the user has told
2276 		 * us that the signal handlers are safe by setting:
2277 		 *	export _THREAD_ASYNC_SAFE=1
2278 		 * we return EDEADLK rather than actually deadlocking.
2279 		 */
2280 		if (tsp == NULL &&
2281 		    MUTEX_OWNER(mp) == self && !self->ul_async_safe) {
2282 			DTRACE_PROBE2(plockstat, mutex__error, mp, EDEADLK);
2283 			return (EDEADLK);
2284 		}
2285 	}
2286 
2287 	/*
2288 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2289 	 * no error detection, and no lock statistics.
2290 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2291 	 */
2292 	if ((gflags = self->ul_schedctl_called) != NULL &&
2293 	    (gflags->uf_trs_ted |
2294 	    (mtype & ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK))) == 0) {
2295 		if (mtype & USYNC_PROCESS)
2296 			return (fast_process_lock(mp, tsp, mtype, MUTEX_LOCK));
2297 		sigoff(self);
2298 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2299 			mp->mutex_owner = (uintptr_t)self;
2300 			sigon(self);
2301 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2302 			return (0);
2303 		}
2304 		sigon(self);
2305 		if (mtype && MUTEX_OWNER(mp) == self)
2306 			return (mutex_recursion(mp, mtype, MUTEX_LOCK));
2307 		if (mutex_trylock_adaptive(mp, 1) != 0)
2308 			return (mutex_lock_queue(self, NULL, mp, tsp));
2309 		return (0);
2310 	}
2311 
2312 	/* else do it the long way */
2313 	return (mutex_lock_internal(mp, tsp, MUTEX_LOCK));
2314 }
2315 
2316 #pragma weak pthread_mutex_lock = mutex_lock
2317 #pragma weak _mutex_lock = mutex_lock
2318 int
2319 mutex_lock(mutex_t *mp)
2320 {
2321 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2322 	return (mutex_lock_impl(mp, NULL));
2323 }
2324 
2325 int
2326 pthread_mutex_timedlock(pthread_mutex_t *_RESTRICT_KYWD mp,
2327 	const struct timespec *_RESTRICT_KYWD abstime)
2328 {
2329 	timespec_t tslocal;
2330 	int error;
2331 
2332 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2333 	abstime_to_reltime(CLOCK_REALTIME, abstime, &tslocal);
2334 	error = mutex_lock_impl((mutex_t *)mp, &tslocal);
2335 	if (error == ETIME)
2336 		error = ETIMEDOUT;
2337 	return (error);
2338 }
2339 
2340 int
2341 pthread_mutex_reltimedlock_np(pthread_mutex_t *_RESTRICT_KYWD mp,
2342 	const struct timespec *_RESTRICT_KYWD reltime)
2343 {
2344 	timespec_t tslocal;
2345 	int error;
2346 
2347 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2348 	tslocal = *reltime;
2349 	error = mutex_lock_impl((mutex_t *)mp, &tslocal);
2350 	if (error == ETIME)
2351 		error = ETIMEDOUT;
2352 	return (error);
2353 }
2354 
2355 #pragma weak pthread_mutex_trylock = mutex_trylock
2356 int
2357 mutex_trylock(mutex_t *mp)
2358 {
2359 	ulwp_t *self = curthread;
2360 	uberdata_t *udp = self->ul_uberdata;
2361 	int mtype = mp->mutex_type;
2362 	uberflags_t *gflags;
2363 
2364 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
2365 
2366 	/*
2367 	 * Optimize the case of USYNC_THREAD, including
2368 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2369 	 * no error detection, no lock statistics,
2370 	 * and the process has only a single thread.
2371 	 * (Most likely a traditional single-threaded application.)
2372 	 */
2373 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2374 	    udp->uberflags.uf_all) == 0) {
2375 		/*
2376 		 * Only one thread exists so we don't need an atomic operation.
2377 		 * We do, however, need to protect against signals.
2378 		 */
2379 		if (mp->mutex_lockw == 0) {
2380 			sigoff(self);
2381 			mp->mutex_lockw = LOCKSET;
2382 			mp->mutex_owner = (uintptr_t)self;
2383 			sigon(self);
2384 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2385 			return (0);
2386 		}
2387 		if (mtype && MUTEX_OWNER(mp) == self)
2388 			return (mutex_recursion(mp, mtype, MUTEX_TRY));
2389 		return (EBUSY);
2390 	}
2391 
2392 	/*
2393 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2394 	 * no error detection, and no lock statistics.
2395 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2396 	 */
2397 	if ((gflags = self->ul_schedctl_called) != NULL &&
2398 	    (gflags->uf_trs_ted |
2399 	    (mtype & ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK))) == 0) {
2400 		if (mtype & USYNC_PROCESS)
2401 			return (fast_process_lock(mp, NULL, mtype, MUTEX_TRY));
2402 		sigoff(self);
2403 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2404 			mp->mutex_owner = (uintptr_t)self;
2405 			sigon(self);
2406 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2407 			return (0);
2408 		}
2409 		sigon(self);
2410 		if (mtype && MUTEX_OWNER(mp) == self)
2411 			return (mutex_recursion(mp, mtype, MUTEX_TRY));
2412 		if (__td_event_report(self, TD_LOCK_TRY, udp)) {
2413 			self->ul_td_evbuf.eventnum = TD_LOCK_TRY;
2414 			tdb_event(TD_LOCK_TRY, udp);
2415 		}
2416 		return (EBUSY);
2417 	}
2418 
2419 	/* else do it the long way */
2420 	return (mutex_lock_internal(mp, NULL, MUTEX_TRY));
2421 }
2422 
2423 int
2424 mutex_unlock_internal(mutex_t *mp, int retain_robust_flags)
2425 {
2426 	ulwp_t *self = curthread;
2427 	uberdata_t *udp = self->ul_uberdata;
2428 	int mtype = mp->mutex_type;
2429 	tdb_mutex_stats_t *msp;
2430 	int error = 0;
2431 	int release_all;
2432 	lwpid_t lwpid;
2433 
2434 	if ((mtype & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
2435 	    !mutex_held(mp))
2436 		return (EPERM);
2437 
2438 	if (self->ul_error_detection && !mutex_held(mp))
2439 		lock_error(mp, "mutex_unlock", NULL, NULL);
2440 
2441 	if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2442 		mp->mutex_rcount--;
2443 		DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2444 		return (0);
2445 	}
2446 
2447 	if ((msp = MUTEX_STATS(mp, udp)) != NULL)
2448 		(void) record_hold_time(msp);
2449 
2450 	if (!retain_robust_flags && !(mtype & LOCK_PRIO_INHERIT) &&
2451 	    (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) {
2452 		ASSERT(mtype & LOCK_ROBUST);
2453 		mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED);
2454 		mp->mutex_flag |= LOCK_NOTRECOVERABLE;
2455 	}
2456 	release_all = ((mp->mutex_flag & LOCK_NOTRECOVERABLE) != 0);
2457 
2458 	if (mtype & LOCK_PRIO_INHERIT) {
2459 		no_preempt(self);
2460 		mp->mutex_owner = 0;
2461 		/* mp->mutex_ownerpid is cleared by ___lwp_mutex_unlock() */
2462 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2463 		mp->mutex_lockw = LOCKCLEAR;
2464 		self->ul_pilocks--;
2465 		error = ___lwp_mutex_unlock(mp);
2466 		preempt(self);
2467 	} else if (mtype & USYNC_PROCESS) {
2468 		mutex_unlock_process(mp, release_all);
2469 	} else {	/* USYNC_THREAD */
2470 		if ((lwpid = mutex_unlock_queue(mp, release_all)) != 0) {
2471 			(void) __lwp_unpark(lwpid);
2472 			preempt(self);
2473 		}
2474 	}
2475 
2476 	if (mtype & LOCK_ROBUST)
2477 		forget_lock(mp);
2478 
2479 	if ((mtype & LOCK_PRIO_PROTECT) && _ceil_mylist_del(mp))
2480 		_ceil_prio_waive();
2481 
2482 	return (error);
2483 }
2484 
2485 #pragma weak pthread_mutex_unlock = mutex_unlock
2486 #pragma weak _mutex_unlock = mutex_unlock
2487 int
2488 mutex_unlock(mutex_t *mp)
2489 {
2490 	ulwp_t *self = curthread;
2491 	int mtype = mp->mutex_type;
2492 	uberflags_t *gflags;
2493 	lwpid_t lwpid;
2494 	short el;
2495 
2496 	/*
2497 	 * Optimize the case of USYNC_THREAD, including
2498 	 * the LOCK_RECURSIVE and LOCK_ERRORCHECK cases,
2499 	 * no error detection, no lock statistics,
2500 	 * and the process has only a single thread.
2501 	 * (Most likely a traditional single-threaded application.)
2502 	 */
2503 	if (((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) |
2504 	    self->ul_uberdata->uberflags.uf_all) == 0) {
2505 		if (mtype) {
2506 			/*
2507 			 * At this point we know that one or both of the
2508 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set.
2509 			 */
2510 			if ((mtype & LOCK_ERRORCHECK) && !MUTEX_OWNED(mp, self))
2511 				return (EPERM);
2512 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2513 				mp->mutex_rcount--;
2514 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2515 				return (0);
2516 			}
2517 		}
2518 		/*
2519 		 * Only one thread exists so we don't need an atomic operation.
2520 		 * Also, there can be no waiters.
2521 		 */
2522 		sigoff(self);
2523 		mp->mutex_owner = 0;
2524 		mp->mutex_lockword = 0;
2525 		sigon(self);
2526 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2527 		return (0);
2528 	}
2529 
2530 	/*
2531 	 * Optimize the common cases of USYNC_THREAD or USYNC_PROCESS,
2532 	 * no error detection, and no lock statistics.
2533 	 * Include LOCK_RECURSIVE and LOCK_ERRORCHECK cases.
2534 	 */
2535 	if ((gflags = self->ul_schedctl_called) != NULL) {
2536 		if (((el = gflags->uf_trs_ted) | mtype) == 0) {
2537 fast_unlock:
2538 			if ((lwpid = mutex_unlock_queue(mp, 0)) != 0) {
2539 				(void) __lwp_unpark(lwpid);
2540 				preempt(self);
2541 			}
2542 			return (0);
2543 		}
2544 		if (el)		/* error detection or lock statistics */
2545 			goto slow_unlock;
2546 		if ((mtype & ~(LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0) {
2547 			/*
2548 			 * At this point we know that one or both of the
2549 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set.
2550 			 */
2551 			if ((mtype & LOCK_ERRORCHECK) && !MUTEX_OWNED(mp, self))
2552 				return (EPERM);
2553 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2554 				mp->mutex_rcount--;
2555 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2556 				return (0);
2557 			}
2558 			goto fast_unlock;
2559 		}
2560 		if ((mtype &
2561 		    ~(USYNC_PROCESS|LOCK_RECURSIVE|LOCK_ERRORCHECK)) == 0) {
2562 			/*
2563 			 * At this point we know that zero, one, or both of the
2564 			 * flags LOCK_RECURSIVE or LOCK_ERRORCHECK is set and
2565 			 * that the USYNC_PROCESS flag is set.
2566 			 */
2567 			if ((mtype & LOCK_ERRORCHECK) && !shared_mutex_held(mp))
2568 				return (EPERM);
2569 			if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0) {
2570 				mp->mutex_rcount--;
2571 				DTRACE_PROBE2(plockstat, mutex__release, mp, 1);
2572 				return (0);
2573 			}
2574 			mutex_unlock_process(mp, 0);
2575 			return (0);
2576 		}
2577 	}
2578 
2579 	/* else do it the long way */
2580 slow_unlock:
2581 	return (mutex_unlock_internal(mp, 0));
2582 }
2583 
2584 /*
2585  * Internally to the library, almost all mutex lock/unlock actions
2586  * go through these lmutex_ functions, to protect critical regions.
2587  * We replicate a bit of code from mutex_lock() and mutex_unlock()
2588  * to make these functions faster since we know that the mutex type
2589  * of all internal locks is USYNC_THREAD.  We also know that internal
2590  * locking can never fail, so we panic if it does.
2591  */
2592 void
2593 lmutex_lock(mutex_t *mp)
2594 {
2595 	ulwp_t *self = curthread;
2596 	uberdata_t *udp = self->ul_uberdata;
2597 
2598 	ASSERT(mp->mutex_type == USYNC_THREAD);
2599 
2600 	enter_critical(self);
2601 	/*
2602 	 * Optimize the case of no lock statistics and only a single thread.
2603 	 * (Most likely a traditional single-threaded application.)
2604 	 */
2605 	if (udp->uberflags.uf_all == 0) {
2606 		/*
2607 		 * Only one thread exists; the mutex must be free.
2608 		 */
2609 		ASSERT(mp->mutex_lockw == 0);
2610 		mp->mutex_lockw = LOCKSET;
2611 		mp->mutex_owner = (uintptr_t)self;
2612 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2613 	} else {
2614 		tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2615 
2616 		if (!self->ul_schedctl_called)
2617 			(void) setup_schedctl();
2618 
2619 		if (set_lock_byte(&mp->mutex_lockw) == 0) {
2620 			mp->mutex_owner = (uintptr_t)self;
2621 			DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2622 		} else if (mutex_trylock_adaptive(mp, 1) != 0) {
2623 			(void) mutex_lock_queue(self, msp, mp, NULL);
2624 		}
2625 
2626 		if (msp)
2627 			record_begin_hold(msp);
2628 	}
2629 }
2630 
2631 void
2632 lmutex_unlock(mutex_t *mp)
2633 {
2634 	ulwp_t *self = curthread;
2635 	uberdata_t *udp = self->ul_uberdata;
2636 
2637 	ASSERT(mp->mutex_type == USYNC_THREAD);
2638 
2639 	/*
2640 	 * Optimize the case of no lock statistics and only a single thread.
2641 	 * (Most likely a traditional single-threaded application.)
2642 	 */
2643 	if (udp->uberflags.uf_all == 0) {
2644 		/*
2645 		 * Only one thread exists so there can be no waiters.
2646 		 */
2647 		mp->mutex_owner = 0;
2648 		mp->mutex_lockword = 0;
2649 		DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2650 	} else {
2651 		tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
2652 		lwpid_t lwpid;
2653 
2654 		if (msp)
2655 			(void) record_hold_time(msp);
2656 		if ((lwpid = mutex_unlock_queue(mp, 0)) != 0) {
2657 			(void) __lwp_unpark(lwpid);
2658 			preempt(self);
2659 		}
2660 	}
2661 	exit_critical(self);
2662 }
2663 
2664 /*
2665  * For specialized code in libc, like the asynchronous i/o code,
2666  * the following sig_*() locking primitives are used in order
2667  * to make the code asynchronous signal safe.  Signals are
2668  * deferred while locks acquired by these functions are held.
2669  */
2670 void
2671 sig_mutex_lock(mutex_t *mp)
2672 {
2673 	sigoff(curthread);
2674 	(void) mutex_lock(mp);
2675 }
2676 
2677 void
2678 sig_mutex_unlock(mutex_t *mp)
2679 {
2680 	(void) mutex_unlock(mp);
2681 	sigon(curthread);
2682 }
2683 
2684 int
2685 sig_mutex_trylock(mutex_t *mp)
2686 {
2687 	int error;
2688 
2689 	sigoff(curthread);
2690 	if ((error = mutex_trylock(mp)) != 0)
2691 		sigon(curthread);
2692 	return (error);
2693 }
2694 
2695 /*
2696  * sig_cond_wait() is a cancellation point.
2697  */
2698 int
2699 sig_cond_wait(cond_t *cv, mutex_t *mp)
2700 {
2701 	int error;
2702 
2703 	ASSERT(curthread->ul_sigdefer != 0);
2704 	pthread_testcancel();
2705 	error = __cond_wait(cv, mp);
2706 	if (error == EINTR && curthread->ul_cursig) {
2707 		sig_mutex_unlock(mp);
2708 		/* take the deferred signal here */
2709 		sig_mutex_lock(mp);
2710 	}
2711 	pthread_testcancel();
2712 	return (error);
2713 }
2714 
2715 /*
2716  * sig_cond_reltimedwait() is a cancellation point.
2717  */
2718 int
2719 sig_cond_reltimedwait(cond_t *cv, mutex_t *mp, const timespec_t *ts)
2720 {
2721 	int error;
2722 
2723 	ASSERT(curthread->ul_sigdefer != 0);
2724 	pthread_testcancel();
2725 	error = __cond_reltimedwait(cv, mp, ts);
2726 	if (error == EINTR && curthread->ul_cursig) {
2727 		sig_mutex_unlock(mp);
2728 		/* take the deferred signal here */
2729 		sig_mutex_lock(mp);
2730 	}
2731 	pthread_testcancel();
2732 	return (error);
2733 }
2734 
2735 /*
2736  * For specialized code in libc, like the stdio code.
2737  * the following cancel_safe_*() locking primitives are used in
2738  * order to make the code cancellation-safe.  Cancellation is
2739  * deferred while locks acquired by these functions are held.
2740  */
2741 void
2742 cancel_safe_mutex_lock(mutex_t *mp)
2743 {
2744 	(void) mutex_lock(mp);
2745 	curthread->ul_libc_locks++;
2746 }
2747 
2748 int
2749 cancel_safe_mutex_trylock(mutex_t *mp)
2750 {
2751 	int error;
2752 
2753 	if ((error = mutex_trylock(mp)) == 0)
2754 		curthread->ul_libc_locks++;
2755 	return (error);
2756 }
2757 
2758 void
2759 cancel_safe_mutex_unlock(mutex_t *mp)
2760 {
2761 	ulwp_t *self = curthread;
2762 
2763 	ASSERT(self->ul_libc_locks != 0);
2764 
2765 	(void) mutex_unlock(mp);
2766 
2767 	/*
2768 	 * Decrement the count of locks held by cancel_safe_mutex_lock().
2769 	 * If we are then in a position to terminate cleanly and
2770 	 * if there is a pending cancellation and cancellation
2771 	 * is not disabled and we received EINTR from a recent
2772 	 * system call then perform the cancellation action now.
2773 	 */
2774 	if (--self->ul_libc_locks == 0 &&
2775 	    !(self->ul_vfork | self->ul_nocancel |
2776 	    self->ul_critical | self->ul_sigdefer) &&
2777 	    cancel_active())
2778 		pthread_exit(PTHREAD_CANCELED);
2779 }
2780 
2781 static int
2782 shared_mutex_held(mutex_t *mparg)
2783 {
2784 	/*
2785 	 * The 'volatile' is necessary to make sure the compiler doesn't
2786 	 * reorder the tests of the various components of the mutex.
2787 	 * They must be tested in this order:
2788 	 *	mutex_lockw
2789 	 *	mutex_owner
2790 	 *	mutex_ownerpid
2791 	 * This relies on the fact that everywhere mutex_lockw is cleared,
2792 	 * mutex_owner and mutex_ownerpid are cleared before mutex_lockw
2793 	 * is cleared, and that everywhere mutex_lockw is set, mutex_owner
2794 	 * and mutex_ownerpid are set after mutex_lockw is set, and that
2795 	 * mutex_lockw is set or cleared with a memory barrier.
2796 	 */
2797 	volatile mutex_t *mp = (volatile mutex_t *)mparg;
2798 	ulwp_t *self = curthread;
2799 	uberdata_t *udp = self->ul_uberdata;
2800 
2801 	return (MUTEX_OWNED(mp, self) && mp->mutex_ownerpid == udp->pid);
2802 }
2803 
2804 #pragma weak _mutex_held = mutex_held
2805 int
2806 mutex_held(mutex_t *mparg)
2807 {
2808 	volatile mutex_t *mp = (volatile mutex_t *)mparg;
2809 
2810 	if (mparg->mutex_type & USYNC_PROCESS)
2811 		return (shared_mutex_held(mparg));
2812 	return (MUTEX_OWNED(mp, curthread));
2813 }
2814 
2815 #pragma weak pthread_mutex_destroy = mutex_destroy
2816 #pragma weak _mutex_destroy = mutex_destroy
2817 int
2818 mutex_destroy(mutex_t *mp)
2819 {
2820 	if (mp->mutex_type & USYNC_PROCESS)
2821 		forget_lock(mp);
2822 	(void) memset(mp, 0, sizeof (*mp));
2823 	tdb_sync_obj_deregister(mp);
2824 	return (0);
2825 }
2826 
2827 #pragma weak pthread_mutex_consistent_np = mutex_consistent
2828 #pragma weak pthread_mutex_consistent = mutex_consistent
2829 int
2830 mutex_consistent(mutex_t *mp)
2831 {
2832 	/*
2833 	 * Do this only for an inconsistent, initialized robust lock
2834 	 * that we hold.  For all other cases, return EINVAL.
2835 	 */
2836 	if (mutex_held(mp) &&
2837 	    (mp->mutex_type & LOCK_ROBUST) &&
2838 	    (mp->mutex_flag & LOCK_INITED) &&
2839 	    (mp->mutex_flag & (LOCK_OWNERDEAD | LOCK_UNMAPPED))) {
2840 		mp->mutex_flag &= ~(LOCK_OWNERDEAD | LOCK_UNMAPPED);
2841 		mp->mutex_rcount = 0;
2842 		return (0);
2843 	}
2844 	return (EINVAL);
2845 }
2846 
2847 /*
2848  * Spin locks are separate from ordinary mutexes,
2849  * but we use the same data structure for them.
2850  */
2851 
2852 int
2853 pthread_spin_init(pthread_spinlock_t *lock, int pshared)
2854 {
2855 	mutex_t *mp = (mutex_t *)lock;
2856 
2857 	(void) memset(mp, 0, sizeof (*mp));
2858 	if (pshared == PTHREAD_PROCESS_SHARED)
2859 		mp->mutex_type = USYNC_PROCESS;
2860 	else
2861 		mp->mutex_type = USYNC_THREAD;
2862 	mp->mutex_flag = LOCK_INITED;
2863 	mp->mutex_magic = MUTEX_MAGIC;
2864 
2865 	/*
2866 	 * This should be at the beginning of the function,
2867 	 * but for the sake of old broken applications that
2868 	 * do not have proper alignment for their mutexes
2869 	 * (and don't check the return code from pthread_spin_init),
2870 	 * we put it here, after initializing the mutex regardless.
2871 	 */
2872 	if (((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1)) &&
2873 	    curthread->ul_misaligned == 0)
2874 		return (EINVAL);
2875 
2876 	return (0);
2877 }
2878 
2879 int
2880 pthread_spin_destroy(pthread_spinlock_t *lock)
2881 {
2882 	(void) memset(lock, 0, sizeof (*lock));
2883 	return (0);
2884 }
2885 
2886 int
2887 pthread_spin_trylock(pthread_spinlock_t *lock)
2888 {
2889 	mutex_t *mp = (mutex_t *)lock;
2890 	ulwp_t *self = curthread;
2891 	int error = 0;
2892 
2893 	no_preempt(self);
2894 	if (set_lock_byte(&mp->mutex_lockw) != 0)
2895 		error = EBUSY;
2896 	else {
2897 		mp->mutex_owner = (uintptr_t)self;
2898 		if (mp->mutex_type == USYNC_PROCESS)
2899 			mp->mutex_ownerpid = self->ul_uberdata->pid;
2900 		DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, 0);
2901 	}
2902 	preempt(self);
2903 	return (error);
2904 }
2905 
2906 int
2907 pthread_spin_lock(pthread_spinlock_t *lock)
2908 {
2909 	mutex_t *mp = (mutex_t *)lock;
2910 	ulwp_t *self = curthread;
2911 	volatile uint8_t *lockp = (volatile uint8_t *)&mp->mutex_lockw;
2912 	int count = 0;
2913 
2914 	ASSERT(!self->ul_critical || self->ul_bindflags);
2915 
2916 	DTRACE_PROBE1(plockstat, mutex__spin, mp);
2917 
2918 	/*
2919 	 * We don't care whether the owner is running on a processor.
2920 	 * We just spin because that's what this interface requires.
2921 	 */
2922 	for (;;) {
2923 		if (*lockp == 0) {	/* lock byte appears to be clear */
2924 			no_preempt(self);
2925 			if (set_lock_byte(lockp) == 0)
2926 				break;
2927 			preempt(self);
2928 		}
2929 		if (count < INT_MAX)
2930 			count++;
2931 		SMT_PAUSE();
2932 	}
2933 	mp->mutex_owner = (uintptr_t)self;
2934 	if (mp->mutex_type == USYNC_PROCESS)
2935 		mp->mutex_ownerpid = self->ul_uberdata->pid;
2936 	preempt(self);
2937 	if (count) {
2938 		DTRACE_PROBE3(plockstat, mutex__spun, mp, 1, count);
2939 	}
2940 	DTRACE_PROBE3(plockstat, mutex__acquire, mp, 0, count);
2941 	return (0);
2942 }
2943 
2944 int
2945 pthread_spin_unlock(pthread_spinlock_t *lock)
2946 {
2947 	mutex_t *mp = (mutex_t *)lock;
2948 	ulwp_t *self = curthread;
2949 
2950 	no_preempt(self);
2951 	mp->mutex_owner = 0;
2952 	mp->mutex_ownerpid = 0;
2953 	DTRACE_PROBE2(plockstat, mutex__release, mp, 0);
2954 	(void) atomic_swap_32(&mp->mutex_lockword, 0);
2955 	preempt(self);
2956 	return (0);
2957 }
2958 
2959 #define	INITIAL_LOCKS	8	/* initial size of ul_heldlocks.array */
2960 
2961 /*
2962  * Find/allocate an entry for 'lock' in our array of held locks.
2963  */
2964 static mutex_t **
2965 find_lock_entry(mutex_t *lock)
2966 {
2967 	ulwp_t *self = curthread;
2968 	mutex_t **remembered = NULL;
2969 	mutex_t **lockptr;
2970 	uint_t nlocks;
2971 
2972 	if ((nlocks = self->ul_heldlockcnt) != 0)
2973 		lockptr = self->ul_heldlocks.array;
2974 	else {
2975 		nlocks = 1;
2976 		lockptr = &self->ul_heldlocks.single;
2977 	}
2978 
2979 	for (; nlocks; nlocks--, lockptr++) {
2980 		if (*lockptr == lock)
2981 			return (lockptr);
2982 		if (*lockptr == NULL && remembered == NULL)
2983 			remembered = lockptr;
2984 	}
2985 	if (remembered != NULL) {
2986 		*remembered = lock;
2987 		return (remembered);
2988 	}
2989 
2990 	/*
2991 	 * No entry available.  Allocate more space, converting
2992 	 * the single entry into an array of entries if necessary.
2993 	 */
2994 	if ((nlocks = self->ul_heldlockcnt) == 0) {
2995 		/*
2996 		 * Initial allocation of the array.
2997 		 * Convert the single entry into an array.
2998 		 */
2999 		self->ul_heldlockcnt = nlocks = INITIAL_LOCKS;
3000 		lockptr = lmalloc(nlocks * sizeof (mutex_t *));
3001 		/*
3002 		 * The single entry becomes the first entry in the array.
3003 		 */
3004 		*lockptr = self->ul_heldlocks.single;
3005 		self->ul_heldlocks.array = lockptr;
3006 		/*
3007 		 * Return the next available entry in the array.
3008 		 */
3009 		*++lockptr = lock;
3010 		return (lockptr);
3011 	}
3012 	/*
3013 	 * Reallocate the array, double the size each time.
3014 	 */
3015 	lockptr = lmalloc(nlocks * 2 * sizeof (mutex_t *));
3016 	(void) memcpy(lockptr, self->ul_heldlocks.array,
3017 	    nlocks * sizeof (mutex_t *));
3018 	lfree(self->ul_heldlocks.array, nlocks * sizeof (mutex_t *));
3019 	self->ul_heldlocks.array = lockptr;
3020 	self->ul_heldlockcnt *= 2;
3021 	/*
3022 	 * Return the next available entry in the newly allocated array.
3023 	 */
3024 	*(lockptr += nlocks) = lock;
3025 	return (lockptr);
3026 }
3027 
3028 /*
3029  * Insert 'lock' into our list of held locks.
3030  * Currently only used for LOCK_ROBUST mutexes.
3031  */
3032 void
3033 remember_lock(mutex_t *lock)
3034 {
3035 	(void) find_lock_entry(lock);
3036 }
3037 
3038 /*
3039  * Remove 'lock' from our list of held locks.
3040  * Currently only used for LOCK_ROBUST mutexes.
3041  */
3042 void
3043 forget_lock(mutex_t *lock)
3044 {
3045 	*find_lock_entry(lock) = NULL;
3046 }
3047 
3048 /*
3049  * Free the array of held locks.
3050  */
3051 void
3052 heldlock_free(ulwp_t *ulwp)
3053 {
3054 	uint_t nlocks;
3055 
3056 	if ((nlocks = ulwp->ul_heldlockcnt) != 0)
3057 		lfree(ulwp->ul_heldlocks.array, nlocks * sizeof (mutex_t *));
3058 	ulwp->ul_heldlockcnt = 0;
3059 	ulwp->ul_heldlocks.array = NULL;
3060 }
3061 
3062 /*
3063  * Mark all held LOCK_ROBUST mutexes LOCK_OWNERDEAD.
3064  * Called from _thrp_exit() to deal with abandoned locks.
3065  */
3066 void
3067 heldlock_exit(void)
3068 {
3069 	ulwp_t *self = curthread;
3070 	mutex_t **lockptr;
3071 	uint_t nlocks;
3072 	mutex_t *mp;
3073 
3074 	if ((nlocks = self->ul_heldlockcnt) != 0)
3075 		lockptr = self->ul_heldlocks.array;
3076 	else {
3077 		nlocks = 1;
3078 		lockptr = &self->ul_heldlocks.single;
3079 	}
3080 
3081 	for (; nlocks; nlocks--, lockptr++) {
3082 		/*
3083 		 * The kernel takes care of transitioning held
3084 		 * LOCK_PRIO_INHERIT mutexes to LOCK_OWNERDEAD.
3085 		 * We avoid that case here.
3086 		 */
3087 		if ((mp = *lockptr) != NULL &&
3088 		    mutex_held(mp) &&
3089 		    (mp->mutex_type & (LOCK_ROBUST | LOCK_PRIO_INHERIT)) ==
3090 		    LOCK_ROBUST) {
3091 			mp->mutex_rcount = 0;
3092 			if (!(mp->mutex_flag & LOCK_UNMAPPED))
3093 				mp->mutex_flag |= LOCK_OWNERDEAD;
3094 			(void) mutex_unlock_internal(mp, 1);
3095 		}
3096 	}
3097 
3098 	heldlock_free(self);
3099 }
3100 
3101 #pragma weak _cond_init = cond_init
3102 /* ARGSUSED2 */
3103 int
3104 cond_init(cond_t *cvp, int type, void *arg)
3105 {
3106 	if (type != USYNC_THREAD && type != USYNC_PROCESS)
3107 		return (EINVAL);
3108 	(void) memset(cvp, 0, sizeof (*cvp));
3109 	cvp->cond_type = (uint16_t)type;
3110 	cvp->cond_magic = COND_MAGIC;
3111 
3112 	/*
3113 	 * This should be at the beginning of the function,
3114 	 * but for the sake of old broken applications that
3115 	 * do not have proper alignment for their condvars
3116 	 * (and don't check the return code from cond_init),
3117 	 * we put it here, after initializing the condvar regardless.
3118 	 */
3119 	if (((uintptr_t)cvp & (_LONG_LONG_ALIGNMENT - 1)) &&
3120 	    curthread->ul_misaligned == 0)
3121 		return (EINVAL);
3122 
3123 	return (0);
3124 }
3125 
3126 /*
3127  * cond_sleep_queue(): utility function for cond_wait_queue().
3128  *
3129  * Go to sleep on a condvar sleep queue, expect to be waked up
3130  * by someone calling cond_signal() or cond_broadcast() or due
3131  * to receiving a UNIX signal or being cancelled, or just simply
3132  * due to a spurious wakeup (like someome calling forkall()).
3133  *
3134  * The associated mutex is *not* reacquired before returning.
3135  * That must be done by the caller of cond_sleep_queue().
3136  */
3137 static int
3138 cond_sleep_queue(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3139 {
3140 	ulwp_t *self = curthread;
3141 	queue_head_t *qp;
3142 	queue_head_t *mqp;
3143 	lwpid_t lwpid;
3144 	int signalled;
3145 	int error;
3146 	int cv_wake;
3147 	int release_all;
3148 
3149 	/*
3150 	 * Put ourself on the CV sleep queue, unlock the mutex, then
3151 	 * park ourself and unpark a candidate lwp to grab the mutex.
3152 	 * We must go onto the CV sleep queue before dropping the
3153 	 * mutex in order to guarantee atomicity of the operation.
3154 	 */
3155 	self->ul_sp = stkptr();
3156 	qp = queue_lock(cvp, CV);
3157 	enqueue(qp, self, 0);
3158 	cvp->cond_waiters_user = 1;
3159 	self->ul_cvmutex = mp;
3160 	self->ul_cv_wake = cv_wake = (tsp != NULL);
3161 	self->ul_signalled = 0;
3162 	if (mp->mutex_flag & LOCK_OWNERDEAD) {
3163 		mp->mutex_flag &= ~LOCK_OWNERDEAD;
3164 		mp->mutex_flag |= LOCK_NOTRECOVERABLE;
3165 	}
3166 	release_all = ((mp->mutex_flag & LOCK_NOTRECOVERABLE) != 0);
3167 	lwpid = mutex_unlock_queue(mp, release_all);
3168 	for (;;) {
3169 		set_parking_flag(self, 1);
3170 		queue_unlock(qp);
3171 		if (lwpid != 0) {
3172 			lwpid = preempt_unpark(self, lwpid);
3173 			preempt(self);
3174 		}
3175 		/*
3176 		 * We may have a deferred signal present,
3177 		 * in which case we should return EINTR.
3178 		 * Also, we may have received a SIGCANCEL; if so
3179 		 * and we are cancelable we should return EINTR.
3180 		 * We force an immediate EINTR return from
3181 		 * __lwp_park() by turning our parking flag off.
3182 		 */
3183 		if (self->ul_cursig != 0 ||
3184 		    (self->ul_cancelable && self->ul_cancel_pending))
3185 			set_parking_flag(self, 0);
3186 		/*
3187 		 * __lwp_park() will return the residual time in tsp
3188 		 * if we are unparked before the timeout expires.
3189 		 */
3190 		error = __lwp_park(tsp, lwpid);
3191 		set_parking_flag(self, 0);
3192 		lwpid = 0;	/* unpark the other lwp only once */
3193 		/*
3194 		 * We were waked up by cond_signal(), cond_broadcast(),
3195 		 * by an interrupt or timeout (EINTR or ETIME),
3196 		 * or we may just have gotten a spurious wakeup.
3197 		 */
3198 		qp = queue_lock(cvp, CV);
3199 		if (!cv_wake)
3200 			mqp = queue_lock(mp, MX);
3201 		if (self->ul_sleepq == NULL)
3202 			break;
3203 		/*
3204 		 * We are on either the condvar sleep queue or the
3205 		 * mutex sleep queue.  Break out of the sleep if we
3206 		 * were interrupted or we timed out (EINTR or ETIME).
3207 		 * Else this is a spurious wakeup; continue the loop.
3208 		 */
3209 		if (!cv_wake && self->ul_sleepq == mqp) { /* mutex queue */
3210 			if (error) {
3211 				mp->mutex_waiters = dequeue_self(mqp);
3212 				break;
3213 			}
3214 			tsp = NULL;	/* no more timeout */
3215 		} else if (self->ul_sleepq == qp) {	/* condvar queue */
3216 			if (error) {
3217 				cvp->cond_waiters_user = dequeue_self(qp);
3218 				break;
3219 			}
3220 			/*
3221 			 * Else a spurious wakeup on the condvar queue.
3222 			 * __lwp_park() has already adjusted the timeout.
3223 			 */
3224 		} else {
3225 			thr_panic("cond_sleep_queue(): thread not on queue");
3226 		}
3227 		if (!cv_wake)
3228 			queue_unlock(mqp);
3229 	}
3230 
3231 	self->ul_sp = 0;
3232 	self->ul_cv_wake = 0;
3233 	ASSERT(self->ul_cvmutex == NULL);
3234 	ASSERT(self->ul_sleepq == NULL && self->ul_link == NULL &&
3235 	    self->ul_wchan == NULL);
3236 
3237 	signalled = self->ul_signalled;
3238 	self->ul_signalled = 0;
3239 	queue_unlock(qp);
3240 	if (!cv_wake)
3241 		queue_unlock(mqp);
3242 
3243 	/*
3244 	 * If we were concurrently cond_signal()d and any of:
3245 	 * received a UNIX signal, were cancelled, or got a timeout,
3246 	 * then perform another cond_signal() to avoid consuming it.
3247 	 */
3248 	if (error && signalled)
3249 		(void) cond_signal(cvp);
3250 
3251 	return (error);
3252 }
3253 
3254 static void
3255 cond_wait_check_alignment(cond_t *cvp, mutex_t *mp)
3256 {
3257 	if ((uintptr_t)mp & (_LONG_LONG_ALIGNMENT - 1))
3258 		lock_error(mp, "cond_wait", cvp, "mutex is misaligned");
3259 	if ((uintptr_t)cvp & (_LONG_LONG_ALIGNMENT - 1))
3260 		lock_error(mp, "cond_wait", cvp, "condvar is misaligned");
3261 }
3262 
3263 int
3264 cond_wait_queue(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3265 {
3266 	ulwp_t *self = curthread;
3267 	int error;
3268 	int merror;
3269 
3270 	if (self->ul_error_detection && self->ul_misaligned == 0)
3271 		cond_wait_check_alignment(cvp, mp);
3272 
3273 	/*
3274 	 * The old thread library was programmed to defer signals
3275 	 * while in cond_wait() so that the associated mutex would
3276 	 * be guaranteed to be held when the application signal
3277 	 * handler was invoked.
3278 	 *
3279 	 * We do not behave this way by default; the state of the
3280 	 * associated mutex in the signal handler is undefined.
3281 	 *
3282 	 * To accommodate applications that depend on the old
3283 	 * behavior, the _THREAD_COND_WAIT_DEFER environment
3284 	 * variable can be set to 1 and we will behave in the
3285 	 * old way with respect to cond_wait().
3286 	 */
3287 	if (self->ul_cond_wait_defer)
3288 		sigoff(self);
3289 
3290 	error = cond_sleep_queue(cvp, mp, tsp);
3291 
3292 	/*
3293 	 * Reacquire the mutex.
3294 	 */
3295 	if ((merror = mutex_lock_impl(mp, NULL)) != 0)
3296 		error = merror;
3297 
3298 	/*
3299 	 * Take any deferred signal now, after we have reacquired the mutex.
3300 	 */
3301 	if (self->ul_cond_wait_defer)
3302 		sigon(self);
3303 
3304 	return (error);
3305 }
3306 
3307 /*
3308  * cond_sleep_kernel(): utility function for cond_wait_kernel().
3309  * See the comment ahead of cond_sleep_queue(), above.
3310  */
3311 static int
3312 cond_sleep_kernel(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3313 {
3314 	int mtype = mp->mutex_type;
3315 	ulwp_t *self = curthread;
3316 	int error;
3317 
3318 	if ((mtype & LOCK_PRIO_PROTECT) && _ceil_mylist_del(mp))
3319 		_ceil_prio_waive();
3320 
3321 	self->ul_sp = stkptr();
3322 	self->ul_wchan = cvp;
3323 	sigoff(self);
3324 	mp->mutex_owner = 0;
3325 	/* mp->mutex_ownerpid is cleared by ___lwp_cond_wait() */
3326 	if (mtype & LOCK_PRIO_INHERIT) {
3327 		mp->mutex_lockw = LOCKCLEAR;
3328 		self->ul_pilocks--;
3329 	}
3330 	/*
3331 	 * ___lwp_cond_wait() returns immediately with EINTR if
3332 	 * set_parking_flag(self,0) is called on this lwp before it
3333 	 * goes to sleep in the kernel.  sigacthandler() calls this
3334 	 * when a deferred signal is noted.  This assures that we don't
3335 	 * get stuck in ___lwp_cond_wait() with all signals blocked
3336 	 * due to taking a deferred signal before going to sleep.
3337 	 */
3338 	set_parking_flag(self, 1);
3339 	if (self->ul_cursig != 0 ||
3340 	    (self->ul_cancelable && self->ul_cancel_pending))
3341 		set_parking_flag(self, 0);
3342 	error = ___lwp_cond_wait(cvp, mp, tsp, 1);
3343 	set_parking_flag(self, 0);
3344 	sigon(self);
3345 	self->ul_sp = 0;
3346 	self->ul_wchan = NULL;
3347 	return (error);
3348 }
3349 
3350 int
3351 cond_wait_kernel(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3352 {
3353 	ulwp_t *self = curthread;
3354 	int error;
3355 	int merror;
3356 
3357 	if (self->ul_error_detection && self->ul_misaligned == 0)
3358 		cond_wait_check_alignment(cvp, mp);
3359 
3360 	/*
3361 	 * See the large comment in cond_wait_queue(), above.
3362 	 */
3363 	if (self->ul_cond_wait_defer)
3364 		sigoff(self);
3365 
3366 	error = cond_sleep_kernel(cvp, mp, tsp);
3367 
3368 	/*
3369 	 * Override the return code from ___lwp_cond_wait()
3370 	 * with any non-zero return code from mutex_lock().
3371 	 * This addresses robust lock failures in particular;
3372 	 * the caller must see the EOWNERDEAD or ENOTRECOVERABLE
3373 	 * errors in order to take corrective action.
3374 	 */
3375 	if ((merror = mutex_lock_impl(mp, NULL)) != 0)
3376 		error = merror;
3377 
3378 	/*
3379 	 * Take any deferred signal now, after we have reacquired the mutex.
3380 	 */
3381 	if (self->ul_cond_wait_defer)
3382 		sigon(self);
3383 
3384 	return (error);
3385 }
3386 
3387 /*
3388  * Common code for cond_wait() and cond_timedwait()
3389  */
3390 int
3391 cond_wait_common(cond_t *cvp, mutex_t *mp, timespec_t *tsp)
3392 {
3393 	int mtype = mp->mutex_type;
3394 	hrtime_t begin_sleep = 0;
3395 	ulwp_t *self = curthread;
3396 	uberdata_t *udp = self->ul_uberdata;
3397 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3398 	tdb_mutex_stats_t *msp = MUTEX_STATS(mp, udp);
3399 	uint8_t rcount;
3400 	int error = 0;
3401 
3402 	/*
3403 	 * The SUSV3 Posix spec for pthread_cond_timedwait() states:
3404 	 *	Except in the case of [ETIMEDOUT], all these error checks
3405 	 *	shall act as if they were performed immediately at the
3406 	 *	beginning of processing for the function and shall cause
3407 	 *	an error return, in effect, prior to modifying the state
3408 	 *	of the mutex specified by mutex or the condition variable
3409 	 *	specified by cond.
3410 	 * Therefore, we must return EINVAL now if the timout is invalid.
3411 	 */
3412 	if (tsp != NULL &&
3413 	    (tsp->tv_sec < 0 || (ulong_t)tsp->tv_nsec >= NANOSEC))
3414 		return (EINVAL);
3415 
3416 	if (__td_event_report(self, TD_SLEEP, udp)) {
3417 		self->ul_sp = stkptr();
3418 		self->ul_wchan = cvp;
3419 		self->ul_td_evbuf.eventnum = TD_SLEEP;
3420 		self->ul_td_evbuf.eventdata = cvp;
3421 		tdb_event(TD_SLEEP, udp);
3422 		self->ul_sp = 0;
3423 	}
3424 	if (csp) {
3425 		if (tsp)
3426 			tdb_incr(csp->cond_timedwait);
3427 		else
3428 			tdb_incr(csp->cond_wait);
3429 	}
3430 	if (msp)
3431 		begin_sleep = record_hold_time(msp);
3432 	else if (csp)
3433 		begin_sleep = gethrtime();
3434 
3435 	if (self->ul_error_detection) {
3436 		if (!mutex_held(mp))
3437 			lock_error(mp, "cond_wait", cvp, NULL);
3438 		if ((mtype & LOCK_RECURSIVE) && mp->mutex_rcount != 0)
3439 			lock_error(mp, "recursive mutex in cond_wait",
3440 			    cvp, NULL);
3441 		if (cvp->cond_type & USYNC_PROCESS) {
3442 			if (!(mtype & USYNC_PROCESS))
3443 				lock_error(mp, "cond_wait", cvp,
3444 				    "condvar process-shared, "
3445 				    "mutex process-private");
3446 		} else {
3447 			if (mtype & USYNC_PROCESS)
3448 				lock_error(mp, "cond_wait", cvp,
3449 				    "condvar process-private, "
3450 				    "mutex process-shared");
3451 		}
3452 	}
3453 
3454 	/*
3455 	 * We deal with recursive mutexes by completely
3456 	 * dropping the lock and restoring the recursion
3457 	 * count after waking up.  This is arguably wrong,
3458 	 * but it obeys the principle of least astonishment.
3459 	 */
3460 	rcount = mp->mutex_rcount;
3461 	mp->mutex_rcount = 0;
3462 	if ((mtype &
3463 	    (USYNC_PROCESS | LOCK_PRIO_INHERIT | LOCK_PRIO_PROTECT)) |
3464 	    (cvp->cond_type & USYNC_PROCESS))
3465 		error = cond_wait_kernel(cvp, mp, tsp);
3466 	else
3467 		error = cond_wait_queue(cvp, mp, tsp);
3468 	mp->mutex_rcount = rcount;
3469 
3470 	if (csp) {
3471 		hrtime_t lapse = gethrtime() - begin_sleep;
3472 		if (tsp == NULL)
3473 			csp->cond_wait_sleep_time += lapse;
3474 		else {
3475 			csp->cond_timedwait_sleep_time += lapse;
3476 			if (error == ETIME)
3477 				tdb_incr(csp->cond_timedwait_timeout);
3478 		}
3479 	}
3480 	return (error);
3481 }
3482 
3483 /*
3484  * cond_wait() is a cancellation point but __cond_wait() is not.
3485  * Internally, libc calls the non-cancellation version.
3486  * Other libraries need to use pthread_setcancelstate(), as appropriate,
3487  * since __cond_wait() is not exported from libc.
3488  */
3489 int
3490 __cond_wait(cond_t *cvp, mutex_t *mp)
3491 {
3492 	ulwp_t *self = curthread;
3493 	uberdata_t *udp = self->ul_uberdata;
3494 	uberflags_t *gflags;
3495 
3496 	if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
3497 	    !mutex_held(mp))
3498 		return (EPERM);
3499 
3500 	/*
3501 	 * Optimize the common case of USYNC_THREAD plus
3502 	 * no error detection, no lock statistics, and no event tracing.
3503 	 */
3504 	if ((gflags = self->ul_schedctl_called) != NULL &&
3505 	    (cvp->cond_type | mp->mutex_type | gflags->uf_trs_ted |
3506 	    self->ul_td_events_enable |
3507 	    udp->tdb.tdb_ev_global_mask.event_bits[0]) == 0)
3508 		return (cond_wait_queue(cvp, mp, NULL));
3509 
3510 	/*
3511 	 * Else do it the long way.
3512 	 */
3513 	return (cond_wait_common(cvp, mp, NULL));
3514 }
3515 
3516 #pragma weak _cond_wait = cond_wait
3517 int
3518 cond_wait(cond_t *cvp, mutex_t *mp)
3519 {
3520 	int error;
3521 
3522 	_cancelon();
3523 	error = __cond_wait(cvp, mp);
3524 	if (error == EINTR)
3525 		_canceloff();
3526 	else
3527 		_canceloff_nocancel();
3528 	return (error);
3529 }
3530 
3531 /*
3532  * pthread_cond_wait() is a cancellation point.
3533  */
3534 int
3535 pthread_cond_wait(pthread_cond_t *_RESTRICT_KYWD cvp,
3536 	pthread_mutex_t *_RESTRICT_KYWD mp)
3537 {
3538 	int error;
3539 
3540 	error = cond_wait((cond_t *)cvp, (mutex_t *)mp);
3541 	return ((error == EINTR)? 0 : error);
3542 }
3543 
3544 /*
3545  * cond_timedwait() is a cancellation point but __cond_timedwait() is not.
3546  */
3547 int
3548 __cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime)
3549 {
3550 	clockid_t clock_id = cvp->cond_clockid;
3551 	timespec_t reltime;
3552 	int error;
3553 
3554 	if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
3555 	    !mutex_held(mp))
3556 		return (EPERM);
3557 
3558 	if (clock_id != CLOCK_REALTIME && clock_id != CLOCK_HIGHRES)
3559 		clock_id = CLOCK_REALTIME;
3560 	abstime_to_reltime(clock_id, abstime, &reltime);
3561 	error = cond_wait_common(cvp, mp, &reltime);
3562 	if (error == ETIME && clock_id == CLOCK_HIGHRES) {
3563 		/*
3564 		 * Don't return ETIME if we didn't really get a timeout.
3565 		 * This can happen if we return because someone resets
3566 		 * the system clock.  Just return zero in this case,
3567 		 * giving a spurious wakeup but not a timeout.
3568 		 */
3569 		if ((hrtime_t)(uint32_t)abstime->tv_sec * NANOSEC +
3570 		    abstime->tv_nsec > gethrtime())
3571 			error = 0;
3572 	}
3573 	return (error);
3574 }
3575 
3576 int
3577 cond_timedwait(cond_t *cvp, mutex_t *mp, const timespec_t *abstime)
3578 {
3579 	int error;
3580 
3581 	_cancelon();
3582 	error = __cond_timedwait(cvp, mp, abstime);
3583 	if (error == EINTR)
3584 		_canceloff();
3585 	else
3586 		_canceloff_nocancel();
3587 	return (error);
3588 }
3589 
3590 /*
3591  * pthread_cond_timedwait() is a cancellation point.
3592  */
3593 int
3594 pthread_cond_timedwait(pthread_cond_t *_RESTRICT_KYWD cvp,
3595 	pthread_mutex_t *_RESTRICT_KYWD mp,
3596 	const struct timespec *_RESTRICT_KYWD abstime)
3597 {
3598 	int error;
3599 
3600 	error = cond_timedwait((cond_t *)cvp, (mutex_t *)mp, abstime);
3601 	if (error == ETIME)
3602 		error = ETIMEDOUT;
3603 	else if (error == EINTR)
3604 		error = 0;
3605 	return (error);
3606 }
3607 
3608 /*
3609  * cond_reltimedwait() is a cancellation point but __cond_reltimedwait() is not.
3610  */
3611 int
3612 __cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime)
3613 {
3614 	timespec_t tslocal = *reltime;
3615 
3616 	if ((mp->mutex_type & (LOCK_ERRORCHECK | LOCK_ROBUST)) &&
3617 	    !mutex_held(mp))
3618 		return (EPERM);
3619 
3620 	return (cond_wait_common(cvp, mp, &tslocal));
3621 }
3622 
3623 int
3624 cond_reltimedwait(cond_t *cvp, mutex_t *mp, const timespec_t *reltime)
3625 {
3626 	int error;
3627 
3628 	_cancelon();
3629 	error = __cond_reltimedwait(cvp, mp, reltime);
3630 	if (error == EINTR)
3631 		_canceloff();
3632 	else
3633 		_canceloff_nocancel();
3634 	return (error);
3635 }
3636 
3637 int
3638 pthread_cond_reltimedwait_np(pthread_cond_t *_RESTRICT_KYWD cvp,
3639 	pthread_mutex_t *_RESTRICT_KYWD mp,
3640 	const struct timespec *_RESTRICT_KYWD reltime)
3641 {
3642 	int error;
3643 
3644 	error = cond_reltimedwait((cond_t *)cvp, (mutex_t *)mp, reltime);
3645 	if (error == ETIME)
3646 		error = ETIMEDOUT;
3647 	else if (error == EINTR)
3648 		error = 0;
3649 	return (error);
3650 }
3651 
3652 #pragma weak pthread_cond_signal = cond_signal
3653 #pragma weak _cond_signal = cond_signal
3654 int
3655 cond_signal(cond_t *cvp)
3656 {
3657 	ulwp_t *self = curthread;
3658 	uberdata_t *udp = self->ul_uberdata;
3659 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3660 	int error = 0;
3661 	int more;
3662 	lwpid_t lwpid;
3663 	queue_head_t *qp;
3664 	mutex_t *mp;
3665 	queue_head_t *mqp;
3666 	ulwp_t **ulwpp;
3667 	ulwp_t *ulwp;
3668 	ulwp_t *prev;
3669 
3670 	if (csp)
3671 		tdb_incr(csp->cond_signal);
3672 
3673 	if (cvp->cond_waiters_kernel)	/* someone sleeping in the kernel? */
3674 		error = _lwp_cond_signal(cvp);
3675 
3676 	if (!cvp->cond_waiters_user)	/* no one sleeping at user-level */
3677 		return (error);
3678 
3679 	/*
3680 	 * Move someone from the condvar sleep queue to the mutex sleep
3681 	 * queue for the mutex that he will acquire on being waked up.
3682 	 * We can do this only if we own the mutex he will acquire.
3683 	 * If we do not own the mutex, or if his ul_cv_wake flag
3684 	 * is set, just dequeue and unpark him.
3685 	 */
3686 	qp = queue_lock(cvp, CV);
3687 	ulwpp = queue_slot(qp, &prev, &more);
3688 	cvp->cond_waiters_user = more;
3689 	if (ulwpp == NULL) {	/* no one on the sleep queue */
3690 		queue_unlock(qp);
3691 		return (error);
3692 	}
3693 	ulwp = *ulwpp;
3694 
3695 	/*
3696 	 * Inform the thread that he was the recipient of a cond_signal().
3697 	 * This lets him deal with cond_signal() and, concurrently,
3698 	 * one or more of a cancellation, a UNIX signal, or a timeout.
3699 	 * These latter conditions must not consume a cond_signal().
3700 	 */
3701 	ulwp->ul_signalled = 1;
3702 
3703 	/*
3704 	 * Dequeue the waiter but leave his ul_sleepq non-NULL
3705 	 * while we move him to the mutex queue so that he can
3706 	 * deal properly with spurious wakeups.
3707 	 */
3708 	queue_unlink(qp, ulwpp, prev);
3709 
3710 	mp = ulwp->ul_cvmutex;		/* the mutex he will acquire */
3711 	ulwp->ul_cvmutex = NULL;
3712 	ASSERT(mp != NULL);
3713 
3714 	if (ulwp->ul_cv_wake || !MUTEX_OWNED(mp, self)) {
3715 		/* just wake him up */
3716 		lwpid = ulwp->ul_lwpid;
3717 		no_preempt(self);
3718 		ulwp->ul_sleepq = NULL;
3719 		ulwp->ul_wchan = NULL;
3720 		queue_unlock(qp);
3721 		(void) __lwp_unpark(lwpid);
3722 		preempt(self);
3723 	} else {
3724 		/* move him to the mutex queue */
3725 		mqp = queue_lock(mp, MX);
3726 		enqueue(mqp, ulwp, 0);
3727 		mp->mutex_waiters = 1;
3728 		queue_unlock(mqp);
3729 		queue_unlock(qp);
3730 	}
3731 
3732 	return (error);
3733 }
3734 
3735 /*
3736  * Utility function called by mutex_wakeup_all(), cond_broadcast(),
3737  * and rw_queue_release() to (re)allocate a big buffer to hold the
3738  * lwpids of all the threads to be set running after they are removed
3739  * from their sleep queues.  Since we are holding a queue lock, we
3740  * cannot call any function that might acquire a lock.  mmap(), munmap(),
3741  * lwp_unpark_all() are simple system calls and are safe in this regard.
3742  */
3743 lwpid_t *
3744 alloc_lwpids(lwpid_t *lwpid, int *nlwpid_ptr, int *maxlwps_ptr)
3745 {
3746 	/*
3747 	 * Allocate NEWLWPS ids on the first overflow.
3748 	 * Double the allocation each time after that.
3749 	 */
3750 	int nlwpid = *nlwpid_ptr;
3751 	int maxlwps = *maxlwps_ptr;
3752 	int first_allocation;
3753 	int newlwps;
3754 	void *vaddr;
3755 
3756 	ASSERT(nlwpid == maxlwps);
3757 
3758 	first_allocation = (maxlwps == MAXLWPS);
3759 	newlwps = first_allocation? NEWLWPS : 2 * maxlwps;
3760 	vaddr = mmap(NULL, newlwps * sizeof (lwpid_t),
3761 	    PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, (off_t)0);
3762 
3763 	if (vaddr == MAP_FAILED) {
3764 		/*
3765 		 * Let's hope this never happens.
3766 		 * If it does, then we have a terrible
3767 		 * thundering herd on our hands.
3768 		 */
3769 		(void) __lwp_unpark_all(lwpid, nlwpid);
3770 		*nlwpid_ptr = 0;
3771 	} else {
3772 		(void) memcpy(vaddr, lwpid, maxlwps * sizeof (lwpid_t));
3773 		if (!first_allocation)
3774 			(void) munmap((caddr_t)lwpid,
3775 			    maxlwps * sizeof (lwpid_t));
3776 		lwpid = vaddr;
3777 		*maxlwps_ptr = newlwps;
3778 	}
3779 
3780 	return (lwpid);
3781 }
3782 
3783 #pragma weak pthread_cond_broadcast = cond_broadcast
3784 #pragma weak _cond_broadcast = cond_broadcast
3785 int
3786 cond_broadcast(cond_t *cvp)
3787 {
3788 	ulwp_t *self = curthread;
3789 	uberdata_t *udp = self->ul_uberdata;
3790 	tdb_cond_stats_t *csp = COND_STATS(cvp, udp);
3791 	int error = 0;
3792 	queue_head_t *qp;
3793 	queue_root_t *qrp;
3794 	mutex_t *mp;
3795 	mutex_t *mp_cache = NULL;
3796 	queue_head_t *mqp = NULL;
3797 	ulwp_t *ulwp;
3798 	int nlwpid = 0;
3799 	int maxlwps = MAXLWPS;
3800 	lwpid_t buffer[MAXLWPS];
3801 	lwpid_t *lwpid = buffer;
3802 
3803 	if (csp)
3804 		tdb_incr(csp->cond_broadcast);
3805 
3806 	if (cvp->cond_waiters_kernel)	/* someone sleeping in the kernel? */
3807 		error = _lwp_cond_broadcast(cvp);
3808 
3809 	if (!cvp->cond_waiters_user)	/* no one sleeping at user-level */
3810 		return (error);
3811 
3812 	/*
3813 	 * Move everyone from the condvar sleep queue to the mutex sleep
3814 	 * queue for the mutex that they will acquire on being waked up.
3815 	 * We can do this only if we own the mutex they will acquire.
3816 	 * If we do not own the mutex, or if their ul_cv_wake flag
3817 	 * is set, just dequeue and unpark them.
3818 	 *
3819 	 * We keep track of lwpids that are to be unparked in lwpid[].
3820 	 * __lwp_unpark_all() is called to unpark all of them after
3821 	 * they have been removed from the sleep queue and the sleep
3822 	 * queue lock has been dropped.  If we run out of space in our
3823 	 * on-stack buffer, we need to allocate more but we can't call
3824 	 * lmalloc() because we are holding a queue lock when the overflow
3825 	 * occurs and lmalloc() acquires a lock.  We can't use alloca()
3826 	 * either because the application may have allocated a small
3827 	 * stack and we don't want to overrun the stack.  So we call
3828 	 * alloc_lwpids() to allocate a bigger buffer using the mmap()
3829 	 * system call directly since that path acquires no locks.
3830 	 */
3831 	qp = queue_lock(cvp, CV);
3832 	cvp->cond_waiters_user = 0;
3833 	for (;;) {
3834 		if ((qrp = qp->qh_root) == NULL ||
3835 		    (ulwp = qrp->qr_head) == NULL)
3836 			break;
3837 		ASSERT(ulwp->ul_wchan == cvp);
3838 		queue_unlink(qp, &qrp->qr_head, NULL);
3839 		mp = ulwp->ul_cvmutex;		/* his mutex */
3840 		ulwp->ul_cvmutex = NULL;
3841 		ASSERT(mp != NULL);
3842 		if (ulwp->ul_cv_wake || !MUTEX_OWNED(mp, self)) {
3843 			/* just wake him up */
3844 			ulwp->ul_sleepq = NULL;
3845 			ulwp->ul_wchan = NULL;
3846 			if (nlwpid == maxlwps)
3847 				lwpid = alloc_lwpids(lwpid, &nlwpid, &maxlwps);
3848 			lwpid[nlwpid++] = ulwp->ul_lwpid;
3849 		} else {
3850 			/* move him to the mutex queue */
3851 			if (mp != mp_cache) {
3852 				mp_cache = mp;
3853 				if (mqp != NULL)
3854 					queue_unlock(mqp);
3855 				mqp = queue_lock(mp, MX);
3856 			}
3857 			enqueue(mqp, ulwp, 0);
3858 			mp->mutex_waiters = 1;
3859 		}
3860 	}
3861 	if (mqp != NULL)
3862 		queue_unlock(mqp);
3863 	if (nlwpid == 0) {
3864 		queue_unlock(qp);
3865 	} else {
3866 		no_preempt(self);
3867 		queue_unlock(qp);
3868 		if (nlwpid == 1)
3869 			(void) __lwp_unpark(lwpid[0]);
3870 		else
3871 			(void) __lwp_unpark_all(lwpid, nlwpid);
3872 		preempt(self);
3873 	}
3874 	if (lwpid != buffer)
3875 		(void) munmap((caddr_t)lwpid, maxlwps * sizeof (lwpid_t));
3876 	return (error);
3877 }
3878 
3879 #pragma weak pthread_cond_destroy = cond_destroy
3880 int
3881 cond_destroy(cond_t *cvp)
3882 {
3883 	cvp->cond_magic = 0;
3884 	tdb_sync_obj_deregister(cvp);
3885 	return (0);
3886 }
3887 
3888 #if defined(THREAD_DEBUG)
3889 void
3890 assert_no_libc_locks_held(void)
3891 {
3892 	ASSERT(!curthread->ul_critical || curthread->ul_bindflags);
3893 }
3894 
3895 /* protected by link_lock */
3896 uint64_t spin_lock_spin;
3897 uint64_t spin_lock_spin2;
3898 uint64_t spin_lock_sleep;
3899 uint64_t spin_lock_wakeup;
3900 
3901 /*
3902  * Record spin lock statistics.
3903  * Called by a thread exiting itself in thrp_exit().
3904  * Also called via atexit() from the thread calling
3905  * exit() to do all the other threads as well.
3906  */
3907 void
3908 record_spin_locks(ulwp_t *ulwp)
3909 {
3910 	spin_lock_spin += ulwp->ul_spin_lock_spin;
3911 	spin_lock_spin2 += ulwp->ul_spin_lock_spin2;
3912 	spin_lock_sleep += ulwp->ul_spin_lock_sleep;
3913 	spin_lock_wakeup += ulwp->ul_spin_lock_wakeup;
3914 	ulwp->ul_spin_lock_spin = 0;
3915 	ulwp->ul_spin_lock_spin2 = 0;
3916 	ulwp->ul_spin_lock_sleep = 0;
3917 	ulwp->ul_spin_lock_wakeup = 0;
3918 }
3919 
3920 /*
3921  * atexit function:  dump the queue statistics to stderr.
3922  */
3923 #include <stdio.h>
3924 void
3925 dump_queue_statistics(void)
3926 {
3927 	uberdata_t *udp = curthread->ul_uberdata;
3928 	queue_head_t *qp;
3929 	int qn;
3930 	uint64_t spin_lock_total = 0;
3931 
3932 	if (udp->queue_head == NULL || thread_queue_dump == 0)
3933 		return;
3934 
3935 	if (fprintf(stderr, "\n%5d mutex queues:\n", QHASHSIZE) < 0 ||
3936 	    fprintf(stderr, "queue#   lockcount    max qlen    max hlen\n") < 0)
3937 		return;
3938 	for (qn = 0, qp = udp->queue_head; qn < QHASHSIZE; qn++, qp++) {
3939 		if (qp->qh_lockcount == 0)
3940 			continue;
3941 		spin_lock_total += qp->qh_lockcount;
3942 		if (fprintf(stderr, "%5d %12llu%12u%12u\n", qn,
3943 		    (u_longlong_t)qp->qh_lockcount,
3944 		    qp->qh_qmax, qp->qh_hmax) < 0)
3945 			return;
3946 	}
3947 
3948 	if (fprintf(stderr, "\n%5d condvar queues:\n", QHASHSIZE) < 0 ||
3949 	    fprintf(stderr, "queue#   lockcount    max qlen    max hlen\n") < 0)
3950 		return;
3951 	for (qn = 0; qn < QHASHSIZE; qn++, qp++) {
3952 		if (qp->qh_lockcount == 0)
3953 			continue;
3954 		spin_lock_total += qp->qh_lockcount;
3955 		if (fprintf(stderr, "%5d %12llu%12u%12u\n", qn,
3956 		    (u_longlong_t)qp->qh_lockcount,
3957 		    qp->qh_qmax, qp->qh_hmax) < 0)
3958 			return;
3959 	}
3960 
3961 	(void) fprintf(stderr, "\n  spin_lock_total  = %10llu\n",
3962 	    (u_longlong_t)spin_lock_total);
3963 	(void) fprintf(stderr, "  spin_lock_spin   = %10llu\n",
3964 	    (u_longlong_t)spin_lock_spin);
3965 	(void) fprintf(stderr, "  spin_lock_spin2  = %10llu\n",
3966 	    (u_longlong_t)spin_lock_spin2);
3967 	(void) fprintf(stderr, "  spin_lock_sleep  = %10llu\n",
3968 	    (u_longlong_t)spin_lock_sleep);
3969 	(void) fprintf(stderr, "  spin_lock_wakeup = %10llu\n",
3970 	    (u_longlong_t)spin_lock_wakeup);
3971 }
3972 #endif
3973