#define LCK_SLEEP_EXCLUSIVE 0x04 /* Reclaim the lock in exclusive mode (RW only) */
#define LCK_SLEEP_SPIN 0x08 /* Reclaim the lock in spin mode (mutex only) */
#define LCK_SLEEP_PROMOTED_PRI 0x10 /* Sleep at a promoted priority */
+#define LCK_SLEEP_SPIN_ALWAYS 0x20 /* Reclaim the lock in spin-always mode (mutex only) */
-#define LCK_SLEEP_MASK 0x1f /* Valid actions */
+#define LCK_SLEEP_MASK 0x3f /* Valid actions */
#ifdef MACH_KERNEL_PRIVATE
lck_grp_stat_t lck_grp_stat;
} lck_grp_t;
+#define lck_grp_miss lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_miss_cnt
+#define lck_grp_held lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_held_cnt
+#define lck_grp_util lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_util_cnt
+#define lck_grp_wait lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_wait_cnt
+#define lck_grp_direct_wait lck_grp_stat.lck_grp_mtx_stat.lck_grp_mtx_held_cnt
+
#define LCK_GRP_NULL (lck_grp_t *)0
#else
#ifdef KERNEL_PRIVATE
+extern void lck_spin_lock_nopreempt( lck_spin_t *lck);
+
+extern void lck_spin_unlock_nopreempt( lck_spin_t *lck);
+
extern boolean_t lck_spin_try_lock( lck_spin_t *lck);
+extern boolean_t lck_spin_try_lock_nopreempt( lck_spin_t *lck);
+
/* NOT SAFE: To be used only by kernel debugger to avoid deadlock. */
extern boolean_t kdp_lck_spin_is_acquired( lck_spin_t *lck);
event_t event,
wait_interrupt_t interruptible,
uint64_t deadline);
+#if DEVELOPMENT || DEBUG
+extern void erase_all_test_mtx_stats(void);
+extern int get_test_mtx_stats_string(char* buffer, int buffer_size);
+extern void lck_mtx_test_init(void);
+extern void lck_mtx_test_lock(void);
+extern void lck_mtx_test_unlock(void);
+extern int lck_mtx_test_mtx_uncontended(int iter, char* buffer, int buffer_size);
+extern int lck_mtx_test_mtx_contended(int iter, char* buffer, int buffer_size);
+extern int lck_mtx_test_mtx_uncontended_loop_time(int iter, char* buffer, int buffer_size);
+extern int lck_mtx_test_mtx_contended_loop_time(int iter, char* buffer, int buffer_size);
+#endif
#ifdef KERNEL_PRIVATE
#if MACH_ASSERT
#define LCK_MTX_ASSERT(lck,type) lck_mtx_assert((lck),(type))
+#define LCK_SPIN_ASSERT(lck,type) lck_spin_assert((lck),(type))
+#define LCK_RW_ASSERT(lck,type) lck_rw_assert((lck),(type))
#else /* MACH_ASSERT */
#define LCK_MTX_ASSERT(lck,type)
+#define LCK_SPIN_ASSERT(lck,type)
+#define LCK_RW_ASSERT(lck,type)
#endif /* MACH_ASSERT */
#if DEBUG
#define LCK_MTX_ASSERT_DEBUG(lck,type) lck_mtx_assert((lck),(type))
+#define LCK_SPIN_ASSERT_DEBUG(lck,type) lck_spin_assert((lck),(type))
+#define LCK_RW_ASSERT_DEBUG(lck,type) lck_rw_assert((lck),(type))
#else /* DEBUG */
#define LCK_MTX_ASSERT_DEBUG(lck,type)
+#define LCK_SPIN_ASSERT_DEBUG(lck,type)
+#define LCK_RW_ASSERT_DEBUG(lck,type)
#endif /* DEBUG */
__END_DECLS
extern void lck_mtx_unlock_wakeup(
lck_mtx_t *lck,
thread_t holder);
-extern void lck_mtx_unlockspin_wakeup(
- lck_mtx_t *lck);
extern boolean_t lck_mtx_ilk_unlock(
lck_mtx_t *lck);
extern boolean_t lck_mtx_ilk_try_lock(
lck_mtx_t *lck);
+extern void lck_mtx_wakeup_adjust_pri(thread_t thread, integer_t priority);
+
#endif
#define decl_lck_rw_data(class,name) class lck_rw_t name;
extern void lck_rw_unlock_shared(
lck_rw_t *lck);
+extern boolean_t lck_rw_lock_yield_shared(
+ lck_rw_t *lck,
+ boolean_t force_yield);
+
extern void lck_rw_lock_exclusive(
lck_rw_t *lck);
lck_rw_t *lck,
unsigned int type);
-extern void lck_rw_clear_promotion(
- thread_t thread);
+extern void lck_rw_clear_promotion(thread_t thread, uintptr_t trace_obj);
extern void lck_rw_set_promotion_locked(thread_t thread);
+
+uintptr_t unslide_for_kdebug(void* object);
#endif
#ifdef KERNEL_PRIVATE