//! Implementation of [`TaskManager`] //! //! It is only used to manage processes and schedule process based on ready queue. //! Other CPU process monitoring functions are in Processor. use super::TaskControlBlock; use crate::sync::UPSafeCell; use alloc::collections::VecDeque; use alloc::sync::Arc; use lazy_static::*; pub struct TaskManager { ready_queue: VecDeque>, } // YOUR JOB: FIFO->Stride /// A simple FIFO scheduler. impl TaskManager { pub fn new() -> Self { Self { ready_queue: VecDeque::new(), } } /// Add process back to ready queue pub fn add(&mut self, task: Arc) { self.ready_queue.push_back(task); } /// Take a process out of the ready queue pub fn fetch(&mut self) -> Option> { self.ready_queue.pop_front() } } lazy_static! { /// TASK_MANAGER instance through lazy_static! pub static ref TASK_MANAGER: UPSafeCell = unsafe { UPSafeCell::new(TaskManager::new()) }; } pub fn add_task(task: Arc) { TASK_MANAGER.exclusive_access().add(task); } pub fn fetch_task() -> Option> { TASK_MANAGER.exclusive_access().fetch() }