+#if DISPATCH_USE_DTRACE || DISPATCH_USE_DTRACE_INTROSPECTION
+typedef struct dispatch_trace_timer_params_s {
+ int64_t deadline, interval, leeway;
+} *dispatch_trace_timer_params_t;
+
+#include "provider.h"
+#endif // DISPATCH_USE_DTRACE || DISPATCH_USE_DTRACE_INTROSPECTION
+
+#if __has_include(<sys/kdebug.h>)
+#include <sys/kdebug.h>
+#ifndef DBG_DISPATCH
+#define DBG_DISPATCH 46
+#endif
+#ifndef KDBG_CODE
+#define KDBG_CODE(...) 0
+#define DBG_FUNC_START 0
+#define DBG_FUNC_END 0
+#endif
+#define DISPATCH_CODE(subclass, code) \
+ KDBG_CODE(DBG_DISPATCH, DISPATCH_TRACE_SUBCLASS_##subclass, code)
+#define DISPATCH_CODE_START(subclass, code) \
+ (DISPATCH_CODE(subclass, code) | DBG_FUNC_START)
+#define DISPATCH_CODE_END(subclass, code) \
+ (DISPATCH_CODE(subclass, code) | DBG_FUNC_END)
+#ifdef ARIADNEDBG_CODE
+#define ARIADNE_ENTER_DISPATCH_MAIN_CODE ARIADNEDBG_CODE(220, 2)
+#else
+#define ARIADNE_ENTER_DISPATCH_MAIN_CODE 0
+#endif
+#if !defined(DISPATCH_USE_VOUCHER_KDEBUG_TRACE) && \
+ (DISPATCH_INTROSPECTION || DISPATCH_PROFILE || DISPATCH_DEBUG)
+#define DISPATCH_USE_VOUCHER_KDEBUG_TRACE 1
+#endif
+
+#define DISPATCH_TRACE_SUBCLASS_DEFAULT 0
+#define DISPATCH_TRACE_SUBCLASS_VOUCHER 1
+#define DISPATCH_TRACE_SUBCLASS_PERF 2
+#define DISPATCH_TRACE_SUBCLASS_MACH_MSG 3
+#define DISPATCH_TRACE_SUBCLASS_PERF_MON 4
+
+#define DISPATCH_PERF_non_leaf_retarget DISPATCH_CODE(PERF, 1)
+#define DISPATCH_PERF_post_activate_retarget DISPATCH_CODE(PERF, 2)
+#define DISPATCH_PERF_post_activate_mutation DISPATCH_CODE(PERF, 3)
+#define DISPATCH_PERF_delayed_registration DISPATCH_CODE(PERF, 4)
+#define DISPATCH_PERF_mutable_target DISPATCH_CODE(PERF, 5)
+#define DISPATCH_PERF_strict_bg_timer DISPATCH_CODE(PERF, 6)
+
+#define DISPATCH_MACH_MSG_hdr_move DISPATCH_CODE(MACH_MSG, 1)
+
+#define DISPATCH_PERF_MON_worker_thread_start DISPATCH_CODE_START(PERF_MON, 1)
+#define DISPATCH_PERF_MON_worker_thread_end DISPATCH_CODE_END(PERF_MON, 1)
+#define DISPATCH_PERF_MON_worker_useless DISPATCH_CODE(PERF_MON, 2)
+
+DISPATCH_ALWAYS_INLINE
+static inline void
+_dispatch_ktrace_impl(uint32_t code, uint64_t a, uint64_t b,
+ uint64_t c, uint64_t d)
+{
+ if (!code) return;
+#ifdef _COMM_PAGE_KDEBUG_ENABLE
+ if (likely(*(volatile uint32_t *)_COMM_PAGE_KDEBUG_ENABLE == 0)) return;
+#endif
+ kdebug_trace(code, a, b, c, d);
+}
+#define _dispatch_cast_to_uint64(e) \
+ __builtin_choose_expr(sizeof(e) > 4, \
+ ((uint64_t)(e)), ((uint64_t)(uintptr_t)(e)))
+#define _dispatch_ktrace(code, a, b, c, d) _dispatch_ktrace_impl(code, \
+ _dispatch_cast_to_uint64(a), _dispatch_cast_to_uint64(b), \
+ _dispatch_cast_to_uint64(c), _dispatch_cast_to_uint64(d))
+
+#else // __has_include(<sys/kdebug.h>)
+#define DISPATCH_CODE(subclass, code) 0
+#define ARIADNE_ENTER_DISPATCH_MAIN_CODE 0
+#define DISPATCH_USE_VOUCHER_KDEBUG_TRACE 0
+#define _dispatch_ktrace(code, a, b, c, d)
+#endif // !__has_include(<sys/kdebug.h>)
+#define _dispatch_ktrace4(code, a, b, c, d) _dispatch_ktrace(code, a, b, c, d)
+#define _dispatch_ktrace3(code, a, b, c) _dispatch_ktrace(code, a, b, c, 0)
+#define _dispatch_ktrace2(code, a, b) _dispatch_ktrace(code, a, b, 0, 0)
+#define _dispatch_ktrace1(code, a) _dispatch_ktrace(code, a, 0, 0, 0)
+#define _dispatch_ktrace0(code) _dispatch_ktrace(code, 0, 0, 0, 0)
+