]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/sys/ulock.h
xnu-6153.101.6.tar.gz
[apple/xnu.git] / bsd / sys / ulock.h
index 5a1b5f62e91b5c0bb226d6f0f6f8e52ddc507c3d..b86d10eeff2d2c6e4767b1c569106ef71bb56c8c 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (c) 2015 Apple Inc. All rights reserved.
  *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
- * 
+ *
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
  * unlawful or unlicensed copies of an Apple operating system, or to
  * circumvent, violate, or enable the circumvention or violation of, any
  * terms of an Apple operating system software license agreement.
- * 
+ *
  * Please obtain a copy of the License at
  * http://www.opensource.apple.com/apsl/ and read it before using this file.
- * 
+ *
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
  * Please see the License for the specific language governing rights and
  * limitations under the License.
- * 
+ *
  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 
 #ifndef _SYS_ULOCK_H
 #define _SYS_ULOCK_H
 
+#include <mach/mach_port.h>
+#include <sys/cdefs.h>
+#include <stdint.h>
+
 __BEGIN_DECLS
 
 #if PRIVATE
@@ -58,29 +62,36 @@ ulock_owner_value_to_port_name(uint32_t uval)
 #ifndef KERNEL
 
 extern int __ulock_wait(uint32_t operation, void *addr, uint64_t value,
-               uint32_t timeout); /* timeout is specified in microseconds */
+    uint32_t timeout);             /* timeout is specified in microseconds */
 extern int __ulock_wake(uint32_t operation, void *addr, uint64_t wake_value);
 
 #endif /* !KERNEL */
 
 /*
- * operation bits [7, 0] contain the operation code
+ * operation bits [7, 0] contain the operation code.
+ *
+ * NOTE: make sure to add logic for handling any new
+ *       types to kdp_ulock_find_owner()
  */
-#define UL_COMPARE_AND_WAIT                            1
-#define UL_UNFAIR_LOCK                                 2
+#define UL_COMPARE_AND_WAIT             1
+#define UL_UNFAIR_LOCK                  2
+#define UL_COMPARE_AND_WAIT_SHARED      3
+#define UL_UNFAIR_LOCK64_SHARED         4
+#define UL_COMPARE_AND_WAIT64           5
+#define UL_COMPARE_AND_WAIT64_SHARED    6
 /* obsolete names */
-#define UL_OSSPINLOCK                                  UL_COMPARE_AND_WAIT
-#define UL_HANDOFFLOCK                                 UL_UNFAIR_LOCK
+#define UL_OSSPINLOCK                   UL_COMPARE_AND_WAIT
+#define UL_HANDOFFLOCK                  UL_UNFAIR_LOCK
 /* These operation code are only implemented in (DEVELOPMENT || DEBUG) kernels */
-#define UL_DEBUG_SIMULATE_COPYIN_FAULT 253
-#define UL_DEBUG_HASH_DUMP_ALL                 254
-#define UL_DEBUG_HASH_DUMP_PID                 255
+#define UL_DEBUG_SIMULATE_COPYIN_FAULT  253
+#define UL_DEBUG_HASH_DUMP_ALL          254
+#define UL_DEBUG_HASH_DUMP_PID          255
 
 /*
  * operation bits [15, 8] contain the flags for __ulock_wake
  */
-#define ULF_WAKE_ALL                                   0x00000100
-#define ULF_WAKE_THREAD                                        0x00000200
+#define ULF_WAKE_ALL                    0x00000100
+#define ULF_WAKE_THREAD                 0x00000200
 
 /*
  * operation bits [23, 16] contain the flags for __ulock_wait
@@ -92,29 +103,34 @@ extern int __ulock_wake(uint32_t operation, void *addr, uint64_t wake_value);
  *
  * @const ULF_WAIT_CANCEL_POINT
  * This wait is a cancelation point
+ *
+ * @const ULF_WAIT_ADAPTIVE_SPIN
+ * Use adaptive spinning when the thread that currently holds the unfair lock
+ * is on core.
  */
 #define ULF_WAIT_WORKQ_DATA_CONTENTION  0x00010000
 #define ULF_WAIT_CANCEL_POINT           0x00020000
+#define ULF_WAIT_ADAPTIVE_SPIN          0x00040000
 
 /*
  * operation bits [31, 24] contain the generic flags
  */
-#define ULF_NO_ERRNO                                   0x01000000
+#define ULF_NO_ERRNO                    0x01000000
 
 /*
  * masks
  */
-#define UL_OPCODE_MASK         0x000000FF
-#define UL_FLAGS_MASK          0xFFFFFF00
-#define ULF_GENERIC_MASK       0xFFFF0000
+#define UL_OPCODE_MASK          0x000000FF
+#define UL_FLAGS_MASK           0xFFFFFF00
+#define ULF_GENERIC_MASK        0xFFFF0000
 
-#define ULF_WAIT_MASK          (ULF_NO_ERRNO | \
-                                                        ULF_WAIT_WORKQ_DATA_CONTENTION | \
-                                                        ULF_WAIT_CANCEL_POINT)
+#define ULF_WAIT_MASK           (ULF_NO_ERRNO | \
+                                ULF_WAIT_WORKQ_DATA_CONTENTION | \
+                                ULF_WAIT_CANCEL_POINT | ULF_WAIT_ADAPTIVE_SPIN)
 
-#define ULF_WAKE_MASK          (ULF_WAKE_ALL | \
-                                                        ULF_WAKE_THREAD | \
-                                                        ULF_NO_ERRNO)
+#define ULF_WAKE_MASK           (ULF_NO_ERRNO | \
+                                ULF_WAKE_ALL | \
+                                ULF_WAKE_THREAD)
 
 #endif /* PRIVATE */