]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/locks.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / osfmk / i386 / locks.h
index 21e74d712d7f926764daa3fb0cf071f8efbc52b4..736f7a4df004b2bbaf350b4b14b6666da03e68c1 100644 (file)
 
 #include <i386/hw_lock_types.h>
 
-extern  unsigned int    LcksOpts;
-#if DEVELOPMENT || DEBUG
-extern  unsigned int    LckDisablePreemptCheck;
-#endif
-
 #define enaLkDeb                0x00000001      /* Request debug in default attribute */
 #define enaLkStat               0x00000002      /* Request statistic in default attribute */
 #define disLkRWPrio             0x00000004      /* Disable RW lock priority promotion */
@@ -81,10 +76,10 @@ typedef struct _lck_mtx_ {
                                struct {
                                        volatile uint32_t
                                            lck_mtx_waiters:16,
-                                           lck_mtx_pri:8,
+                                           lck_mtx_pri:8, // unused
                                            lck_mtx_ilocked:1,
                                            lck_mtx_mlocked:1,
-                                           lck_mtx_promoted:1,
+                                           lck_mtx_promoted:1, // unused
                                            lck_mtx_spin:1,
                                            lck_mtx_is_ext:1,
                                            lck_mtx_pad3:3;
@@ -107,7 +102,6 @@ typedef struct _lck_mtx_ {
 #define LCK_MTX_PRIORITY_MSK            0x00ff0000
 #define LCK_MTX_ILOCKED_MSK             0x01000000
 #define LCK_MTX_MLOCKED_MSK             0x02000000
-#define LCK_MTX_PROMOTED_MSK            0x04000000
 #define LCK_MTX_SPIN_MSK                0x08000000
 
 /* This pattern must subsume the interlocked, mlocked and spin bits */
@@ -116,15 +110,23 @@ typedef struct _lck_mtx_ {
 
 /* Adaptive spin before blocking */
 extern uint64_t         MutexSpin;
+extern uint64_t         low_MutexSpin;
+extern int64_t         high_MutexSpin;
 
 typedef enum lck_mtx_spinwait_ret_type {
        LCK_MTX_SPINWAIT_ACQUIRED = 0,
-       LCK_MTX_SPINWAIT_SPUN = 1,
-       LCK_MTX_SPINWAIT_NO_SPIN = 2,
+
+       LCK_MTX_SPINWAIT_SPUN_HIGH_THR = 1,
+       LCK_MTX_SPINWAIT_SPUN_OWNER_NOT_CORE = 2,
+       LCK_MTX_SPINWAIT_SPUN_NO_WINDOW_CONTENTION = 3,
+       LCK_MTX_SPINWAIT_SPUN_SLIDING_THR = 4,
+
+       LCK_MTX_SPINWAIT_NO_SPIN = 5,
 } lck_mtx_spinwait_ret_type_t;
 
 extern lck_mtx_spinwait_ret_type_t              lck_mtx_lock_spinwait_x86(lck_mtx_t *mutex);
-extern void                                     lck_mtx_lock_wait_x86(lck_mtx_t *mutex);
+struct turnstile;
+extern void                                     lck_mtx_lock_wait_x86(lck_mtx_t *mutex, struct turnstile **ts);
 extern void                                     lck_mtx_lock_acquire_x86(lck_mtx_t *mutex);
 
 extern void                                     lck_mtx_lock_slow(lck_mtx_t *lock);
@@ -262,8 +264,8 @@ static_assert(sizeof(lck_rw_t) == LCK_RW_T_SIZE);
 
 #if LOCK_PRIVATE
 
-#define disable_preemption_for_thread(t) ((cpu_data_t GS_RELATIVE *)0UL)->cpu_preemption_level++
-#define preemption_disabled_for_thread(t) (((cpu_data_t GS_RELATIVE *)0UL)->cpu_preemption_level > 0)
+#define disable_preemption_for_thread(t)   disable_preemption_internal()
+#define preemption_disabled_for_thread(t)  (get_preemption_level() > 0)
 
 #define LCK_MTX_THREAD_TO_STATE(t)      ((uintptr_t)t)
 #define PLATFORM_LCK_ILOCK              0