123456789101112131415161718192021222324252627282930 |
- use core::hint::spin_loop;
- use log::error;
- use crate::{
- arch::CurrentIrqArch,
- exception::InterruptArch,
- process::{ProcessFlags, ProcessManager},
- sched::{SchedMode, __schedule},
- };
- impl ProcessManager {
- /// 每个核的idle进程
- pub fn arch_idle_func() -> ! {
- loop {
- let pcb = ProcessManager::current_pcb();
- if pcb.flags().contains(ProcessFlags::NEED_SCHEDULE) {
- __schedule(SchedMode::SM_NONE);
- }
- if CurrentIrqArch::is_irq_enabled() {
- unsafe {
- x86::halt();
- }
- } else {
- error!("Idle process should not be scheduled with IRQs disabled.");
- spin_loop();
- }
- }
- }
- }
|