    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41

    //!Implementation of [`TaskManager`]
    use super::TaskControlBlock;
    use crate::sync::UPSafeCell;
    use alloc::collections::VecDeque;
    use alloc::sync::Arc;
    use lazy_static::*;
    ///A array of `TaskControlBlock` that is thread-safe
    pub struct TaskManager {
        ready_queue: VecDeque<Arc<TaskControlBlock>>,
    }

    /// A simple FIFO scheduler.
    impl TaskManager {
        ///Creat an empty TaskManager
        pub fn new() -> Self {
            Self {
                ready_queue: VecDeque::new(),
            }
        }
        ///Add a task to `TaskManager`
        pub fn add(&mut self, task: Arc<TaskControlBlock>) {
            self.ready_queue.push_back(task);
        }
        ///Remove the first task and return it,or `None` if `TaskManager` is empty
        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()) };
    }
    ///Interface offered to add task
    pub fn add_task(task: Arc<TaskControlBlock>) {
        TASK_MANAGER.exclusive_access().add(task);
    }
    ///Interface offered to pop the first task
    pub fn fetch_task() -> Option<Arc<TaskControlBlock>> {
        TASK_MANAGER.exclusive_access().fetch()
    }