Gangs Patched — Rcore
impl GangScheduler pub fn new() -> Self Self gangs: BTreeMap::new(), task_to_gang: BTreeMap::new(), ready_gangs: VecDeque::new(),
pub struct GangScheduler gangs: BTreeMap<usize, Arc<Mutex<Gang>>>, task_to_gang: BTreeMap<usize, usize>, ready_gangs: VecDeque<usize>, // queue of gang IDs ready to run rcore gangs
fn next(&mut self) -> Option<Arc<TaskControlBlock>> if let Some(tid) = self.gang_sched.pick_next_task() return find_task_by_tid(tid); self.inner.next() impl GangScheduler pub fn new() -> Self Self
pub struct HybridScheduler inner: RoundRobinScheduler, gang_sched: GangScheduler, impl GangScheduler pub fn new() ->
/// Called when a task becomes runnable (e.g., wakes from I/O or is created) pub fn notify_task_ready(&mut self, tid: usize) if let Some(&gang_id) = self.task_to_gang.get(&tid) let gang = self.gangs.get(&gang_id).unwrap(); let mut gang_lock = gang.lock(); // Check if all members are now runnable let all_ready = gang_lock.members.iter().all(
pub fn create_gang(&mut self, members: Vec<usize>) -> usize let id = self.gangs.len(); let gang = Arc::new(Mutex::new(Gang id, members: members.clone(), status: GangStatus::Pending, )); for &tid in &members self.task_to_gang.insert(tid, id); self.gangs.insert(id, gang); id