1 // Copyright (c) 2023 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 12 /* Mocking mach_absolute_time() */ 13 #define mach_absolute_time mock_absolute_time 14 extern uint64_t mock_absolute_time(void); 15 extern void set_mock_time(uint64_t timestamp); 16 extern void increment_mock_time(uint64_t added_time); 17 extern void increment_mock_time_us(uint64_t added_us); 18 19 /* Test harness utilities */ 20 extern void init_harness(char *test_name); 21 extern struct thread_group *create_tg(int interactivity_score); 22 extern test_thread_t create_thread(int th_sched_bucket, struct thread_group *tg, int pri); 23 extern void set_thread_sched_mode(test_thread_t thread, int mode); 24 extern void set_thread_processor_bound(test_thread_t thread); 25 extern void set_thread_current(test_thread_t thread); 26 extern bool runqueue_empty(void); 27 extern void enqueue_thread(test_thread_t thread); 28 extern void enqueue_threads(int num_threads, ...); 29 extern void enqueue_threads_arr(int num_threads, test_thread_t *threads); 30 extern void enqueue_threads_rand_order(unsigned int random_seed, int num_threads, ...); 31 extern void enqueue_threads_arr_rand_order(unsigned int random_seed, int num_threads, test_thread_t *threads); 32 extern bool dequeue_thread_expect(test_thread_t expected_thread); 33 extern int dequeue_threads_expect_ordered(int num_threads, ...); 34 extern int dequeue_threads_expect_ordered_arr(int num_threads, test_thread_t *threads); 35 extern bool dequeue_thread_expect_compare_current(test_thread_t expected_thread); 36 extern bool check_preempt_current(bool preemption_expected); 37 extern bool tracepoint_expect(uint64_t trace_code, uint64_t arg1, uint64_t arg2, uint64_t arg3, uint64_t arg4); 38 extern void disable_auto_current_thread(void); 39 40 /* Functions implemented by specific scheduler policy (i.e. Clutch) */ 41 extern void impl_init_runqueue(void); 42 extern struct thread_group *impl_create_tg(int interactivity_score); 43 extern test_thread_t impl_create_thread(int th_sched_bucket, struct thread_group *tg, int pri); 44 extern void impl_set_thread_sched_mode(test_thread_t thread, int mode); 45 extern void impl_set_thread_processor_bound(test_thread_t thread); 46 extern void impl_set_thread_current(test_thread_t thread); 47 extern void impl_clear_thread_current(void); 48 extern void impl_enqueue_thread(test_thread_t thread); 49 extern test_thread_t impl_dequeue_thread(void); 50 extern test_thread_t impl_dequeue_thread_compare_current(void); 51 extern bool impl_processor_csw_check(void); 52 extern void impl_pop_tracepoint(uint64_t *trace_code, uint64_t *arg1, uint64_t *arg2, uint64_t *arg3, uint64_t *arg4); 53 extern void impl_cleanup_harness(void); 54