1 // Copyright (c) 2024 Apple Inc. All rights reserved. 2 3 #pragma once 4 5 #include <stdint.h> 6 #include <stdbool.h> 7 #include <stdarg.h> 8 9 /* Opaque thread pointer */ 10 typedef void *test_thread_t; 11 extern uint64_t get_thread_tid(test_thread_t thread); 12 13 /* Publish access to debug log */ 14 extern FILE *_log; 15 16 /* Mocking mach_absolute_time() */ 17 #define mach_absolute_time mock_absolute_time 18 extern uint64_t mock_absolute_time(void); 19 extern void set_mock_time(uint64_t timestamp); 20 extern void increment_mock_time(uint64_t added_time); 21 extern void increment_mock_time_us(uint64_t added_us); 22 23 /* Specifying a runqueue */ 24 typedef enum { 25 TEST_RUNQ_TARGET_TYPE_CPU, 26 TEST_RUNQ_TARGET_TYPE_PSET, 27 } test_runq_target_type_t; 28 29 typedef struct { 30 test_runq_target_type_t target_type; 31 int target_id; 32 } test_runq_target_t; 33 34 extern test_runq_target_t default_target; 35 36 extern int get_default_cpu(void); 37 extern test_runq_target_t pset_target(int cluster_id); 38 extern test_runq_target_t cpu_target(int cpu_id); 39 40 /* Test harness utilities */ 41 extern void init_harness_logging(char *test_name); 42 extern void init_runqueue_harness(void); 43 #define INITIAL_INTERACTIVITY_SCORE -1 44 extern struct thread_group *create_tg(int interactivity_score); 45 extern test_thread_t create_thread(int th_sched_bucket, struct thread_group *tg, int pri); 46 extern void set_thread_sched_mode(test_thread_t thread, int mode); 47 extern void set_thread_processor_bound(test_thread_t thread, int cpu_id); 48 extern void cpu_set_thread_current(int cpu_id, test_thread_t thread); 49 extern test_thread_t cpu_clear_thread_current(int cpu_id); 50 extern bool runqueue_empty(test_runq_target_t runq_target); 51 extern void enqueue_thread(test_runq_target_t runq_target, test_thread_t thread); 52 extern void enqueue_threads(test_runq_target_t runq_target, int num_threads, ...); 53 extern void enqueue_threads_arr(test_runq_target_t runq_target, int num_threads, test_thread_t *threads); 54 extern void enqueue_threads_rand_order(test_runq_target_t runq_target, unsigned int random_seed, int num_threads, ...); 55 extern void enqueue_threads_arr_rand_order(test_runq_target_t runq_target, unsigned int random_seed, int num_threads, test_thread_t *threads); 56 extern bool dequeue_thread_expect(test_runq_target_t runq_target, test_thread_t expected_thread); 57 extern int dequeue_threads_expect_ordered(test_runq_target_t runq_target, int num_threads, ...); 58 extern int dequeue_threads_expect_ordered_arr(test_runq_target_t runq_target, int num_threads, test_thread_t *threads); 59 extern bool cpu_dequeue_thread_expect_compare_current(int cpu_id, test_thread_t expected_thread); 60 extern bool cpu_check_preempt_current(int cpu_id, bool preemption_expected); 61 extern bool tracepoint_expect(uint64_t trace_code, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4); 62 extern void disable_auto_current_thread(void); 63 extern void reenable_auto_current_thread(void); 64 extern bool cpu_check_should_yield(int cpu_id, bool yield_expected); 65 66 /* Realtime thread utilities */ 67 extern void set_thread_realtime(test_thread_t thread, uint32_t period, uint32_t computation, uint32_t constraint, bool preemptible, uint8_t priority_offset, uint64_t deadline); 68