preemptive_threads/
sync.rs1use 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}