MySQL 26.7.0
Source Code Documentation
scheduler.h
Go to the documentation of this file.
1// Copyright (c) 2026, Oracle and/or its affiliates.
2//
3// This program is free software; you can redistribute it and/or modify
4// it under the terms of the GNU General Public License, version 2.0,
5// as published by the Free Software Foundation.
6//
7// This program is designed to work with certain software (including
8// but not limited to OpenSSL) that is licensed under separate terms,
9// as designated in a particular file or component or in included license
10// documentation. The authors of MySQL hereby grant you an additional
11// permission to link the program and your derivative works with the
12// separately licensed software that they have either included with
13// the program or referenced in the documentation.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License, version 2.0, for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
23
24#ifndef MYSQL_SCHEDULER_SCHEDULER_H
25#define MYSQL_SCHEDULER_SCHEDULER_H
26
27#include <algorithm>
28#include <chrono>
29#include <cstdint>
30#include <iostream>
31#include <list>
32#include <memory>
33#include <queue>
34#include <string>
48
49namespace mysql::scheduler {
50
51enum class Sync_method { active };
52
53enum class Scheduler_status {
54 idle,
61 exit
62};
63
64/// @class Scheduler
65/// @brief Main scheduling class
66class Scheduler {
67 public:
70 using Thread_pool_ptr = std::shared_ptr<Thread_pool_type>;
73 using Task_queue_type = std::priority_queue<Scheduled_task>;
74
75 // choose synchronization method
77
78 /// @brief Destructor
79 virtual ~Scheduler();
80
81 /// @brief Ends the scheduler if stop was not yet requested
82 void deinit();
83
84 /// @brief Copying constructor is deleted
85 Scheduler(const Scheduler &src) = delete;
86
87 /// @brief Constructor
88 /// @param shared_thread_pool Shared thread pool
89 /// @param shared_clock Shared scheduler clock
90 /// @param dependency_tracker Dependency tracker
91 /// @param instance_id Unique instance id for statistics monitoring
92 /// @param allowed_task_count Sets the number of ongoing tasks limit to
93 /// selected number. If
94 /// the number of tasks reaches this number, scheduler will synchronize
95 /// to reach 25% of allowed_count tasks
96 /// @param psi_params PSI parameters
98 Thread_pool_ptr shared_thread_pool, Scheduler_clock_ptr shared_clock,
99 Dependency_tracker_ptr dependency_tracker, int instance_id = 0,
100 std::size_t allowed_task_count = std::numeric_limits<std::size_t>::max(),
101 Scheduler_psi psi_params = {});
102
103 /// @brief Enqueues a task
104 /// @details Function adding task to the scheduler
105 /// @tparam FType Functor type
106 /// @tparam Args Functor arguments parameter pack type
107 /// @param schedule Pointer to task schedule
108 /// @param task Functor to execute
109 /// @param args Functor arguments
110 /// @returns True on success, false otherwise
111 template <typename FType, typename... Args>
112 bool enqueue(Task_schedule_ptr schedule, FType &&task, Args &&...args);
113
114 /// @brief Enqueues a task that should execute after a predecessor task
115 /// finishes
116 /// @details Function adding task to the scheduler
117 /// @tparam FType Functor type
118 /// @tparam Args Functor arguments parameter pack type
119 /// @param predecessor Task id that should execute prior to the \a task
120 /// @param schedule Pointer to task schedule
121 /// @param task Functor to execute
122 /// @param args Functor arguments
123 /// @returns True on success, false otherwise
124 template <typename FType, typename... Args>
125 bool enqueue_after(const Task_id &predecessor, Task_schedule_ptr schedule,
126 FType &&task, Args &&...args);
127
128 /// @brief This function waits for currently fired tasks to finish (blocking)
129 /// @param force If enabled, wait for tasks even in case of error or stop
130 /// requested
131 /// @param print_checkpoint Prints diagnostics during waiting
132 /// @retval true Successfully synchronized
133 /// @retval false Stopped while waiting
134 bool synchronize(bool force = true, bool print_checkpoint = false);
135
136 /// @brief Access "timeouts" observability statistics - the number of times
137 /// scheduler timed out while waiting for tasks to schedule
138 std::size_t get_timeouts() const;
139
140 /// @brief Internal function to check on whether error has been set
141 bool is_error() const;
142
143 /// @brief Obtain the number of scheduled, ongoing tasks
144 /// @return the number of scheduled, ongoing tasks
145 std::size_t get_scheduled_tasks_count() const;
146
147 /// @brief Register task phase run according to the given clock
148 /// @param phase_clock Phase clock for the task phase
149 /// @return True if phase was registered. False otherwise
150 bool register_phase(Scheduler_clock_ptr phase_clock);
151
152 /// @brief Instruct the scheduler to stop now and withdraw all work
153 void stop_now();
154
155 /// @brief Function used to notify scheduler thread by the other thread
156 /// (enqueueing thread / worker poll thread)
157 void notify_scheduler();
158
159 /// @brief Ensure space for the next task (eliminates possible wait in the
160 /// enqueue)
161 /// @return True if space is available. False otherwise.
162 bool ensure_space();
163
164 /// @brief This function requests unblocking of the scheduler. After this
165 /// call, the scheduler will try to unblock the workflow
166 void request_unblock();
167
168 protected:
169 using Task_future = std::future<Task_result>;
170 using Futures_list = std::list<Task_future>;
171
172 /// @brief add_dependency
173 /// @param predecessor Predecessor task ID
174 /// @param successor Sucessor task ID
175 /// @details Add dependency function
176 /// @retval true Dependency added successfully
177 /// @retval false Failed to add dependency
178 [[nodiscard]] bool add_dependency(const Task_id &predecessor,
179 const Task_id &successor);
180
181 /// @brief Enqueues a task identified by the \a task_id
182 /// @details Function adding task to the scheduler
183 /// @tparam FType Functor type
184 /// @tparam Args Functor arguments parameter pack type
185 /// @param schedule Pointer to task schedule
186 /// @param task Functor to execute
187 /// @param args Functor arguments
188 /// @returns Task identifier
189 /// @return True if enqueue succeeded, false otherwise
190 template <typename FType, typename... Args>
191 bool enqueue_internal(Task_schedule_ptr schedule, FType &&task,
192 Args &&...args);
193
194 /// @brief end_execution
195 void end_execution();
196
197 /// @brief Waits for scheduler thread to finish its work
199
200 /// @brief Scheduler run function
201 /// @details Function for the thread which schedules tasks for execution
202 void run_main_thread();
203
204 /// @brief Checks phase queues and return true if all are empty
205 /// @return True if all phase queues are empty, false otherwise
206 bool are_phase_queues_empty() const;
207
208 /// @brief Checks whether any phase of the task is ready for execution
209 /// @return True if any task phase is ready for execution, false otherwise
210 bool is_task_phase_ready() const;
211
212 /// @brief Function used to notify that task ended its execution
213 /// @param schedule Task schedule, containing current phase information
214 /// @param task_delay Delay of the whole task w.r.t. scheduler clock
215 /// @param task_error True if enqueued task returned an error, false otherwise
216 /// @param repeatable_task Shared repeatable task state
217 /// @param current_thread_id THP id of the currently executing thread
218 /// @return Task result
219 template <typename Repeatable_task_type>
222 bool task_error,
223 std::shared_ptr<Repeatable_task_type> repeatable_task,
224 unsigned int current_thread_id);
225
226 /// @brief Function used to notify that task phase ended its execution
227 /// @param schedule Task schedule
228 /// @param task_error True if enqueued task returned an error, false otherwise
229 /// @param phase_id Executed phase sequence number
230 /// @return Task result
231 Task_result callback_phase(Task_schedule_ptr schedule, bool task_error,
232 unsigned int phase_id);
233
234 /// @brief Function that enqueues next task phase
235 /// @param schedule Task schedule, containing current phase information
236 /// @param task_delay Delay of the whole task w.r.t. scheduler clock
237 /// @param repeatable_task Shared repeatable task state for this phase
238 /// @param current_thread_id THP id of the currently executing thread
239 /// @param phase_id Enqueued phase sequence number
240 template <typename Repeatable_task_type>
241 bool enqueue_phase(Task_schedule_ptr schedule,
243 std::shared_ptr<Repeatable_task_type> repeatable_task,
244 unsigned int current_thread_id, unsigned int phase_id);
245
247
248 /// @brief Worker error handling function
249 void handle_error();
250
251 /// @brief Scheduler error handling function
252 void scheduler_clean_up();
253
254 /// @brief Enqueue helper
255 /// @details Puts Scheduled task object into the task queue
256 /// @param task Scheduled task rvalue reference
257 /// @return True if enqueue succeeded
258 bool enqueue_helper(Scheduled_task &&task);
259
260 /// @brief Synchronizes the scheduler by actively waiting for finished tasks
261 /// count
262 /// @param print_checkpoint Prints diagnostics during waiting
263 /// @param expected Expected scheduled task count after synchronization
264 /// @param force When true, force synchronization regardless of errors / stop
265 /// requests
266 void synchronize_active(bool print_checkpoint, std::size_t expected,
267 bool force);
268
269 /// @brief Waits for percent of tasks to finish. This function is called
270 /// to reduce contention if clock queue is full. Instead of syncing
271 /// after one pop(), we are allowing the scheduler to process portion
272 /// of tasks. To boost performance, we wait only for a percent of tasks
273 /// to finish. Partial waiting is available only for the active
274 /// synchronization method, which is a default one
275 /// @param print_checkpoint Prints diagnostics during waiting
276 void synchronize_partial(bool print_checkpoint = false);
277
278 /// @brief Actively waits for percent of tasks to finish.
279 /// This function is called
280 /// to reduce contention if clock queue is full. Instead of syncing
281 /// after one pop(), we are allowing the scheduler to process portion
282 /// of tasks. To boost performance, we wait only for a percent of tasks
283 /// to finish
284 /// @param print_checkpoint Prints diagnostics during waiting
285 void synchronize_active_partial(bool print_checkpoint);
286
289
290 /// @brief Helper function to check if the task at the top of the task queue
291 /// is ready
292 /// @return True in case a task is ready
293 bool is_task_ready() const;
294
295 /// Internal function to check if immediate stop was requested, externally or
296 /// due to an error
297 /// @return True if scheduler needs to stop now, false otherwise
298 bool is_stop_requested() const;
299
300 private:
301 /// This is a queue which holds task ready for scheduling. The lower
302 /// scheduled time for a task, the higher the task priority. This
303 /// queue is used by 2 threads, task provider and scheduler main thread.
304 /// We synchronize it with m_mutex_scheduler
305 std::priority_queue<Scheduled_task> m_tasks;
306 /// Variable indicating that scheduler thread finished its execution,
307 /// protected with m_mutex_end
309
310 /// Mutex protecting access to scheduler notifications
312 /// Mutex protecting access to m_tasks, data structure populated by the
313 /// enqueuing thread
315 /// This mutex protect access to phase
317 /// @brief True if scheduler has been notified. Used to release mutex before
318 /// calling notify on cv, which would cause a thread to wake up and block
319 /// immediately
320 /// @details Protected by m_mutex_scheduler
321 std::atomic<bool> m_notification{false};
322 /// Cv used by the scheduler main thread to wait on, when no task is
323 /// available or tasks in m_task queue are not read to execute
325 /// Mutex used to finish execution of the Scheduler, protects
326 /// m_scheduler_thread_active and it is used together with m_cv_end
328 /// cv used by a thread requesting scheduler to finish its work
330
331 /// Internal map that keeps tasks waiting for dependencies defined in the
332 /// Dependency Graph (distinct from time dependencies implemented in the
333 /// Scheduler clock)
334 std::unordered_map<Task_id, Scheduled_task> m_tasks_waiting_for_deps;
335 /// Lock-free queue of task IDs that are ready for execution
337
339
340 /// Scheduler main thread
342 /// Variable that checks whether scheduler should run (true) or
343 /// end its execution (false)
344 std::atomic<bool> m_scheduler_active{true};
345 /// Ensures deinit() is executed only once
346 std::atomic<bool> m_deinitialized{false};
347 /// Variable that instructs scheduler to withdraw all work and stop
348 std::atomic<bool> m_stop_now{false};
349
350 /// The number of scheduled tasks
351 std::atomic<std::size_t> m_scheduled_tasks_cnt{0};
352
353 /// Scheduler clock
355
356 /// Tasks may be divided into phases, each phase works according to a
357 /// defined clock, registered with "register_phase" function. This map
358 /// holds all registered phases: phase clock (key) and associated phase
359 /// queue, in which task phases wait for their phase dependencies (defined
360 /// by the clock) to finish. As an example, task may be divided into
361 /// "apply" phase and "commit" phase. "commit" phase works with
362 /// additional start-to-start commit order dependencies (register workers
363 /// in order of their commit order).
364 std::unordered_map<Scheduler_clock_ptr, Task_queue_type> m_task_phases;
365 std::unordered_map<Scheduler_clock_ptr, Mutex_type> m_task_phases_locks;
366
367 /// Task dependencies, used mainly to implement dependencies between
368 /// events in one transaction or between commit event and parent transaction
369 /// last event (to disallow a transaction to enter a commit when a parent
370 /// transaction, i.e. commit order parent id, did not finish its execution
372 /// Thread pool with threads that execute tasks
374 std::atomic_flag m_is_error = ATOMIC_FLAG_INIT;
375 /// Observability variables
376 std::atomic<Scheduler_status> m_status{Scheduler_status::idle};
377 std::atomic<std::size_t> m_timeouts{0};
378 /// @brief Instance id
379 unsigned int m_instance_id{0};
380 /// Statistics monitoring object for the current instance
382 /// Maximum allowed number of tasks active in the scheduler. Above this
383 /// threshold, provider will block and wait (synchronize_partial)
384 std::atomic<std::size_t> m_allowed_task_count{
386 /// Information on whether enqueueing thread is waiting for available
387 /// task count limit. We allow for dirty reads.
389 /// Stores unblock requests from external threads, will allow N task to enter
390 /// phase
391 std::atomic<bool> m_unblock_request{0};
392 /// PSI parameters
394};
395
396} // namespace mysql::scheduler
397
399
400#endif // MYSQL_SCHEDULER_SCHEDULER_H
Lock-free, fixed-size bounded, multiple-producer (MP), multiple-consumer (MC), circular FIFO queue fo...
Definition: integrals_lockfree_queue.h:130
MySQL wrapper for a condition variable, using mysql_cond_t as implementation of a condition variable ...
Definition: condition_variable_wrapper.h:37
MySQL wrapper for a mutex, template which may be specialized with a specific implementation of a mute...
Definition: mutex_wrapper.h:38
Wrapper to mysql thread, which matches interface of std::thread.
Definition: thread_srv.h:46
Represents task that is scheduled in the priority queue.
Definition: scheduled_task.h:87
uint64_t Time_point_t
Definition: scheduler_clock.h:54
Main scheduling class.
Definition: scheduler.h:66
Scheduler_clock_ptr m_scheduler_clock
Scheduler clock.
Definition: scheduler.h:354
std::size_t get_timeouts() const
Access "timeouts" observability statistics - the number of times scheduler timed out while waiting fo...
Definition: scheduler.cpp:380
std::priority_queue< Scheduled_task > Task_queue_type
Definition: scheduler.h:73
Thread_pool_ptr m_thread_pool
Thread pool with threads that execute tasks.
Definition: scheduler.h:373
bool m_wait_for_task_limit
Information on whether enqueueing thread is waiting for available task count limit.
Definition: scheduler.h:388
void deinit()
Ends the scheduler if stop was not yet requested.
Definition: scheduler.cpp:32
Scheduler(const Scheduler &src)=delete
Copying constructor is deleted.
void wait_for_scheduler_thread_to_stop()
Waits for scheduler thread to finish its work.
Definition: scheduler.cpp:76
Task_result callback(Task_schedule_ptr schedule, Scheduler_clock::Time_point_t task_delay, bool task_error, std::shared_ptr< Repeatable_task_type > repeatable_task, unsigned int current_thread_id)
Function used to notify that task ended its execution.
Definition: scheduler_impl.hpp:168
void request_unblock()
This function requests unblocking of the scheduler.
Definition: scheduler.cpp:429
void notify_scheduler()
Function used to notify scheduler thread by the other thread (enqueueing thread / worker poll thread)
Definition: scheduler.cpp:382
concurrency::Condition_variable m_cv_scheduler
Cv used by the scheduler main thread to wait on, when no task is available or tasks in m_task queue a...
Definition: scheduler.h:324
std::shared_ptr< Thread_pool_type > Thread_pool_ptr
Definition: scheduler.h:70
bool is_task_ready() const
Helper function to check if the task at the top of the task queue is ready.
Definition: scheduler.cpp:121
container::Integrals_lockfree_queue< uint64_t > m_notified_tasks
Lock-free queue of task IDs that are ready for execution.
Definition: scheduler.h:336
std::atomic< bool > m_scheduler_active
Variable that checks whether scheduler should run (true) or end its execution (false)
Definition: scheduler.h:344
std::unordered_map< Scheduler_clock_ptr, Mutex_type > m_task_phases_locks
Definition: scheduler.h:365
Dependency_tracker_ptr m_dependencies
Task dependencies, used mainly to implement dependencies between events in one transaction or between...
Definition: scheduler.h:371
bool is_error() const
Internal function to check on whether error has been set.
Definition: scheduler.cpp:252
std::atomic_flag m_is_error
Definition: scheduler.h:374
Mutex_type m_mutex_notification
Mutex protecting access to scheduler notifications.
Definition: scheduler.h:311
void stop_now()
Instruct the scheduler to stop now and withdraw all work.
Definition: scheduler.cpp:411
std::list< Task_future > Futures_list
Definition: scheduler.h:170
Mutex_type m_mutex_tasks
Mutex protecting access to m_tasks, data structure populated by the enqueuing thread.
Definition: scheduler.h:314
concurrency::Condition_variable m_cv_end
cv used by a thread requesting scheduler to finish its work
Definition: scheduler.h:329
std::atomic< std::size_t > m_scheduled_tasks_cnt
The number of scheduled tasks.
Definition: scheduler.h:351
bool register_phase(Scheduler_clock_ptr phase_clock)
Register task phase run according to the given clock.
Definition: scheduler.cpp:295
std::atomic< Scheduler_status > m_status
Observability variables.
Definition: scheduler.h:376
bool enqueue_helper(Scheduled_task &&task)
Enqueue helper.
Definition: scheduler.cpp:310
std::atomic< std::size_t > m_timeouts
Definition: scheduler.h:377
Task_result callback_phase(Task_schedule_ptr schedule, bool task_error, unsigned int phase_id)
Function used to notify that task phase ended its execution.
Definition: scheduler.cpp:390
bool add_dependency(const Task_id &predecessor, const Task_id &successor)
add_dependency
Definition: scheduler.cpp:86
void synchronize_active(bool print_checkpoint, std::size_t expected, bool force)
Synchronizes the scheduler by actively waiting for finished tasks count.
Definition: scheduler.cpp:322
bool synchronize(bool force=true, bool print_checkpoint=false)
This function waits for currently fired tasks to finish (blocking)
Definition: scheduler.cpp:368
std::unordered_map< Task_id, Scheduled_task > m_tasks_waiting_for_deps
Internal map that keeps tasks waiting for dependencies defined in the Dependency Graph (distinct from...
Definition: scheduler.h:334
std::priority_queue< Scheduled_task > m_tasks
This is a queue which holds task ready for scheduling.
Definition: scheduler.h:305
std::size_t get_scheduled_tasks_count() const
Obtain the number of scheduled, ongoing tasks.
Definition: scheduler.cpp:407
Statistics_instance_monitor_ref m_stat_monitor
Statistics monitoring object for the current instance.
Definition: scheduler.h:381
std::unordered_map< Scheduler_clock_ptr, Task_queue_type > m_task_phases
Tasks may be divided into phases, each phase works according to a defined clock, registered with "reg...
Definition: scheduler.h:364
bool is_task_phase_ready() const
Checks whether any phase of the task is ready for execution.
Definition: scheduler.cpp:109
std::atomic< std::size_t > m_allowed_task_count
Maximum allowed number of tasks active in the scheduler.
Definition: scheduler.h:384
void synchronize_partial(bool print_checkpoint=false)
Waits for percent of tasks to finish.
Definition: scheduler.cpp:376
unsigned int m_instance_id
Instance id.
Definition: scheduler.h:379
bool are_phase_queues_empty() const
Checks phase queues and return true if all are empty.
Definition: scheduler.cpp:91
std::future< Task_result > Task_future
Definition: scheduler.h:169
std::atomic< bool > m_stop_now
Variable that instructs scheduler to withdraw all work and stop.
Definition: scheduler.h:348
bool m_scheduler_thread_active
Variable indicating that scheduler thread finished its execution, protected with m_mutex_end.
Definition: scheduler.h:308
bool enqueue_internal(Task_schedule_ptr schedule, FType &&task, Args &&...args)
Enqueues a task identified by the task_id.
Definition: scheduler_impl.hpp:55
Mutex_type m_mutex_end
Mutex used to finish execution of the Scheduler, protects m_scheduler_thread_active and it is used to...
Definition: scheduler.h:327
bool enqueue_phase(Task_schedule_ptr schedule, Scheduler_clock::Time_point_t task_delay, std::shared_ptr< Repeatable_task_type > repeatable_task, unsigned int current_thread_id, unsigned int phase_id)
Function that enqueues next task phase.
Definition: scheduler_impl.hpp:117
static constexpr Sync_method sync_method
Definition: scheduler.h:76
Mutex_type & get_phase_queue_lock(Scheduler_clock_ptr phase_clock)
Definition: scheduler.cpp:288
std::atomic< bool > m_notification
True if scheduler has been notified.
Definition: scheduler.h:321
std::atomic< bool > m_unblock_request
Stores unblock requests from external threads, will allow N task to enter phase.
Definition: scheduler.h:391
virtual ~Scheduler()
Destructor.
Definition: scheduler.cpp:30
Mutex_type m_mutex_phases
This mutex protect access to phase.
Definition: scheduler.h:316
bool enqueue(Task_schedule_ptr schedule, FType &&task, Args &&...args)
Enqueues a task.
Definition: scheduler_impl.hpp:204
Scheduler_psi m_psi
PSI parameters.
Definition: scheduler.h:393
void handle_error()
Worker error handling function.
Definition: scheduler.cpp:276
void scheduler_clean_up()
Scheduler error handling function.
Definition: scheduler.cpp:254
void synchronize_active_partial(bool print_checkpoint)
Actively waits for percent of tasks to finish.
Definition: scheduler.cpp:359
void run_main_thread()
Scheduler run function.
Definition: scheduler.cpp:126
bool ensure_space()
Ensure space for the next task (eliminates possible wait in the enqueue)
Definition: scheduler.cpp:418
bool enqueue_after(const Task_id &predecessor, Task_schedule_ptr schedule, FType &&task, Args &&...args)
Enqueues a task that should execute after a predecessor task finishes.
Definition: scheduler_impl.hpp:215
Task_queue_type & get_phase_queue(Scheduler_clock_ptr phase_clock)
Definition: scheduler.cpp:281
void end_execution()
end_execution
Definition: scheduler.cpp:81
bool is_stop_requested() const
Internal function to check if immediate stop was requested, externally or due to an error.
Definition: scheduler.cpp:416
Thread_type m_scheduler_thread
Scheduler main thread.
Definition: scheduler.h:341
std::atomic< bool > m_deinitialized
Ensures deinit() is executed only once.
Definition: scheduler.h:346
Represents the identifier of a task ingested by the scheduler,.
Definition: task_id.h:41
MySQL wrapper for a condition variable, template which may be specialized with a specific implementat...
Definition: thread_pool.h:48
ValueType max(X &&first)
Definition: gtid.h:103
Mutex_wrapper Mutex
Definition: mutex_srv.h:40
std::thread Thread
Definition: thread_stl.h:42
Definition: base_dependency_tracker.h:41
std::unique_ptr< Base_dependency_tracker > Dependency_tracker_ptr
Definition: base_dependency_tracker.h:89
Sync_method
Definition: scheduler.h:51
std::reference_wrapper< Statistics_instance_monitor > Statistics_instance_monitor_ref
Definition: statistics_instance_monitor.h:43
Task_result
Acceptable task state after its execution.
Definition: task_result.h:32
std::shared_ptr< Task_schedule > Task_schedule_ptr
Definition: task_schedule.h:41
std::shared_ptr< Scheduler_clock > Scheduler_clock_ptr
Definition: scheduler_clock.h:36
Scheduler_status
Definition: scheduler.h:53
Scheduler instrumentation parameters, packed into this structure to simplify construction of a Schedu...
Definition: scheduler_psi.h:38