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