+ panic("rw lock (%p) not a rw lock type (0x%08X)\n",rlck, lck->lck_rw_deb.type);
+}
+
+void
+lck_rw_assert_ext(
+ lck_rw_ext_t *lck,
+ lck_rw_t *rlck,
+ unsigned int type)
+{
+ lck_rw_check_type(lck, rlck);
+
+ switch (type) {
+ case LCK_RW_ASSERT_SHARED:
+ if (lck->lck_rw.lck_rw_shared_cnt != 0) {
+ return;
+ }
+ break;
+ case LCK_RW_ASSERT_EXCLUSIVE:
+ if ((lck->lck_rw.lck_rw_want_excl ||
+ lck->lck_rw.lck_rw_want_upgrade) &&
+ lck->lck_rw.lck_rw_shared_cnt == 0) {
+ return;
+ }
+ break;
+ case LCK_RW_ASSERT_HELD:
+ if (lck->lck_rw.lck_rw_want_excl ||
+ lck->lck_rw.lck_rw_want_upgrade ||
+ lck->lck_rw.lck_rw_shared_cnt != 0) {
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+
+ panic("rw lock (%p -> %p) not held (mode=%u)\n", rlck, lck, type);
+}
+
+void
+lck_rw_assert(
+ lck_rw_t *lck,
+ unsigned int type)
+{
+ if (lck->lck_rw_tag != LCK_RW_TAG_INDIRECT) {
+ switch (type) {
+ case LCK_RW_ASSERT_SHARED:
+ if (lck->lck_rw_shared_cnt != 0) {
+ return;
+ }
+ break;
+ case LCK_RW_ASSERT_EXCLUSIVE:
+ if (lck->lck_rw_shared_cnt == 0 &&
+ (lck->lck_rw_want_excl ||
+ lck->lck_rw_want_upgrade)) {
+ return;
+ }
+ break;
+ case LCK_RW_ASSERT_HELD:
+ if (lck->lck_rw_shared_cnt != 0 ||
+ lck->lck_rw_want_excl ||
+ lck->lck_rw_want_upgrade) {
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ panic("rw lock (%p) not held (mode=%u)\n", lck, type);
+ } else {
+ lck_rw_assert_ext((lck_rw_ext_t *)lck->lck_rw_ptr,
+ (lck_rw_t *)lck,
+ type);
+ }