200 * The sobj_ops vector exports a set of functions needed when a thread
201 * is asleep on a synchronization object of a given type.
202 */
203 static sobj_ops_t rw_sobj_ops = {
204 SOBJ_RWLOCK, rw_owner, turnstile_stay_asleep, turnstile_change_pri
205 };
206
207 /*
208 * If the system panics on an rwlock, save the address of the offending
209 * rwlock in panic_rwlock_addr, and save the contents in panic_rwlock.
210 */
211 static rwlock_impl_t panic_rwlock;
212 static rwlock_impl_t *panic_rwlock_addr;
213
214 static void
215 rw_panic(char *msg, rwlock_impl_t *lp)
216 {
217 if (panicstr)
218 return;
219
220 if (casptr(&panic_rwlock_addr, NULL, lp) == NULL)
221 panic_rwlock = *lp;
222
223 panic("%s, lp=%p wwwh=%lx thread=%p",
224 msg, (void *)lp, panic_rwlock.rw_wwwh, (void *)curthread);
225 }
226
227 /* ARGSUSED */
228 void
229 rw_init(krwlock_t *rwlp, char *name, krw_type_t type, void *arg)
230 {
231 ((rwlock_impl_t *)rwlp)->rw_wwwh = 0;
232 }
233
234 void
235 rw_destroy(krwlock_t *rwlp)
236 {
237 rwlock_impl_t *lp = (rwlock_impl_t *)rwlp;
238
239 if (lp->rw_wwwh != 0) {
240 if ((lp->rw_wwwh & RW_DOUBLE_LOCK) == RW_DOUBLE_LOCK)
|
200 * The sobj_ops vector exports a set of functions needed when a thread
201 * is asleep on a synchronization object of a given type.
202 */
203 static sobj_ops_t rw_sobj_ops = {
204 SOBJ_RWLOCK, rw_owner, turnstile_stay_asleep, turnstile_change_pri
205 };
206
207 /*
208 * If the system panics on an rwlock, save the address of the offending
209 * rwlock in panic_rwlock_addr, and save the contents in panic_rwlock.
210 */
211 static rwlock_impl_t panic_rwlock;
212 static rwlock_impl_t *panic_rwlock_addr;
213
214 static void
215 rw_panic(char *msg, rwlock_impl_t *lp)
216 {
217 if (panicstr)
218 return;
219
220 if (atomic_cas_ptr(&panic_rwlock_addr, NULL, lp) == NULL)
221 panic_rwlock = *lp;
222
223 panic("%s, lp=%p wwwh=%lx thread=%p",
224 msg, (void *)lp, panic_rwlock.rw_wwwh, (void *)curthread);
225 }
226
227 /* ARGSUSED */
228 void
229 rw_init(krwlock_t *rwlp, char *name, krw_type_t type, void *arg)
230 {
231 ((rwlock_impl_t *)rwlp)->rw_wwwh = 0;
232 }
233
234 void
235 rw_destroy(krwlock_t *rwlp)
236 {
237 rwlock_impl_t *lp = (rwlock_impl_t *)rwlp;
238
239 if (lp->rw_wwwh != 0) {
240 if ((lp->rw_wwwh & RW_DOUBLE_LOCK) == RW_DOUBLE_LOCK)
|