use crate::process::Process;
use alloc::collections::{BTreeMap, VecDeque};
use core::cell::UnsafeCell;
use tg_task_manage::{Manage, PManager, ProcId, Schedule};
pub struct Processor {
inner: UnsafeCell<PManager<Process, ProcManager>>,
}
unsafe impl Sync for Processor {}
impl Processor {
pub const fn new() -> Self {
Self {
inner: UnsafeCell::new(PManager::new()),
}
}
#[inline]
pub fn get_mut(&self) -> &mut PManager<Process, ProcManager> {
unsafe { &mut (*self.inner.get()) }
}
}
pub static PROCESSOR: Processor = Processor::new();
pub struct ProcManager {
tasks: BTreeMap<ProcId, Process>,
ready_queue: VecDeque<ProcId>,
}
impl ProcManager {
pub fn new() -> Self {
Self {
tasks: BTreeMap::new(),
ready_queue: VecDeque::new(),
}
}
}
impl Manage<Process, ProcId> for ProcManager {
#[inline]
fn insert(&mut self, id: ProcId, task: Process) {
self.tasks.insert(id, task);
}
#[inline]
fn get_mut(&mut self, id: ProcId) -> Option<&mut Process> {
self.tasks.get_mut(&id)
}
#[inline]
fn delete(&mut self, id: ProcId) {
self.tasks.remove(&id);
}
}
impl Schedule<ProcId> for ProcManager {
fn add(&mut self, id: ProcId) {
self.ready_queue.push_back(id);
}
fn fetch(&mut self) -> Option<ProcId> {
self.ready_queue.pop_front()
}
}