kernel/
sched.rs

1//! This module provides access to the scheduler.
2
3pub mod scheduler;
4pub mod task;
5pub mod thread;
6
7use hal::Schedable;
8
9use crate::utils::KernelError;
10
11/// Reschedule the tasks.
12pub fn reschedule() {
13    hal::Machine::trigger_reschedule();
14}
15
16/// Create a new task.
17///
18/// `desc` - The task descriptor.
19/// `main_desc` - The main thread descriptor.
20/// `main_timing` - The timing information for the main thread.
21///
22/// Returns the task ID if the task was created successfully, or an error if the task could not be created.
23pub fn create_task(desc: task::TaskDescriptor) -> Result<task::TaskId, KernelError> {
24    enable_scheduler(false);
25    let res = scheduler::SCHEDULER.lock().create_task(desc);
26    enable_scheduler(true);
27
28    res
29}
30
31pub fn create_thread(
32    task_id: task::TaskId,
33    entry: extern "C" fn(),
34    fin: Option<extern "C" fn() -> !>,
35    timing: thread::Timing,
36) -> Result<thread::ThreadUId, KernelError> {
37    enable_scheduler(false);
38    let res = scheduler::SCHEDULER
39        .lock()
40        .create_thread(entry, fin, timing, task_id);
41    enable_scheduler(true);
42
43    res
44}
45
46pub fn enable_scheduler(enable: bool) {
47    scheduler::set_enabled(enable);
48}
49
50pub fn tick_scheduler() -> bool {
51    if !scheduler::enabled() {
52        return false;
53    }
54
55    scheduler::SCHEDULER.lock().tick()
56}