syscall.rs 991 B

12345678910111213141516171819202122232425262728293031323334353637
  1. use system_error::SystemError;
  2. use crate::arch::cpu::current_cpu_id;
  3. use crate::exception::InterruptArch;
  4. use crate::process::ProcessManager;
  5. use crate::sched::CurrentIrqArch;
  6. use crate::sched::Scheduler;
  7. use crate::syscall::Syscall;
  8. use super::fair::CompletelyFairScheduler;
  9. use super::{cpu_rq, schedule, SchedMode};
  10. impl Syscall {
  11. pub fn do_sched_yield() -> Result<usize, SystemError> {
  12. // 禁用中断
  13. let irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
  14. let pcb = ProcessManager::current_pcb();
  15. let rq = cpu_rq(pcb.sched_info().on_cpu().unwrap_or(current_cpu_id()).data() as usize);
  16. let (rq, guard) = rq.self_lock();
  17. // TODO: schedstat_inc(rq->yld_count);
  18. CompletelyFairScheduler::yield_task(rq);
  19. pcb.preempt_disable();
  20. drop(guard);
  21. drop(irq_guard);
  22. pcb.preempt_enable(); // sched_preempt_enable_no_resched();
  23. schedule(SchedMode::SM_NONE);
  24. Ok(0)
  25. }
  26. }