You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use alloc::collections::VecDeque;
|
|
use alloc::sync::Arc;
|
|
use lazy_static::lazy_static;
|
|
use crate::println;
|
|
use crate::task::task::TaskControlBlock;
|
|
use crate::task::UPSafeCell;
|
|
|
|
/// 任务管理器 仅负责管理所有任务, 由ch4 TaskManager 拆分的,
|
|
/// 先入先出的双端队列
|
|
pub struct TaskManager {
|
|
ready_queue: VecDeque<Arc<TaskControlBlock>>,
|
|
}
|
|
|
|
impl TaskManager {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
ready_queue: VecDeque::new(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl TaskManager {
|
|
// 添加一个任务到 队列中
|
|
pub fn add(&mut self, task: Arc<TaskControlBlock>) {
|
|
self.ready_queue.push_back(task);
|
|
}
|
|
// 如果有任务, 弹出第一个任务
|
|
pub fn fetch(&mut self) -> Option<Arc<TaskControlBlock>> {
|
|
self.ready_queue.pop_front()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
lazy_static! {
|
|
// 全局的任务管理器
|
|
pub static ref TASK_MANAGER: UPSafeCell<TaskManager> = unsafe { UPSafeCell::new(TaskManager::new()) };
|
|
}
|
|
/// 给全局任务管理器添加任务
|
|
pub fn add_task(task: Arc<TaskControlBlock>) {
|
|
TASK_MANAGER.exclusive_access().add(task);
|
|
}
|
|
// 全局任务管理器 弹出任务
|
|
pub fn pop_task() -> Option<Arc<TaskControlBlock>> {
|
|
TASK_MANAGER.exclusive_access().fetch()
|
|
} |