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()
}