use crate::sync::UPSafeCell; use super::TaskControlBlock; use alloc::collections::VecDeque; use alloc::sync::Arc; use lazy_static::*; pub struct TaskManager { ready_queue: VecDeque>, } /// A simple FIFO scheduler. impl TaskManager { pub fn new() -> Self { Self { ready_queue: VecDeque::new(), } } pub fn add(&mut self, task: Arc) { self.ready_queue.push_back(task); } pub fn fetch(&mut self) -> Option> { self.ready_queue.pop_front() } } 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() }