xref: /xnu-12377.81.4/tests/sched/sched_test_harness/sched_runqueue_harness.h (revision 043036a2b3718f7f0be807e2870f8f47d3fa0796)
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