preemptive_threads/
sync.rs

1use crate::scheduler::SCHEDULER;
2
3pub fn yield_thread() {
4    unsafe {
5        let scheduler = SCHEDULER.get();
6
7        if let Some(current_id) = scheduler.get_current_thread() {
8            if let Some(next_id) = scheduler.schedule() {
9                if current_id != next_id {
10                    scheduler.set_current_thread(Some(next_id));
11                    let _ = scheduler.switch_context(current_id, next_id);
12                }
13            }
14        }
15    }
16}
17
18pub fn exit_thread() -> ! {
19    unsafe {
20        let scheduler = SCHEDULER.get();
21
22        if let Some(current_id) = scheduler.get_current_thread() {
23            scheduler.exit_current_thread();
24
25            if let Some(next_id) = scheduler.schedule() {
26                scheduler.set_current_thread(Some(next_id));
27                let _ = scheduler.switch_context(current_id, next_id);
28            }
29        }
30    }
31
32    loop {
33        #[cfg(target_arch = "x86_64")]
34        unsafe {
35            core::arch::asm!("hlt")
36        }
37
38        #[cfg(not(target_arch = "x86_64"))]
39        core::hint::spin_loop();
40    }
41}
42
43pub fn sleep_ms(_ms: u64) {
44    yield_thread();
45}