Rcore | Gangs

/// Pick the next runnable gang, then return its next member to run pub fn pick_next_task(&mut self) -> Option<usize> while let Some(gang_id) = self.ready_gangs.pop_front() let gang = self.gangs.get(&gang_id).unwrap(); let mut gang_lock = gang.lock(); if gang_lock.status == GangStatus::Runnable gang_lock.status = GangStatus::Running; // Return the first member that isn't already running on a CPU for &tid in &gang_lock.members if !is_task_running_on_another_cpu(tid) return Some(tid); // If all already running (rare), re-queue self.ready_gangs.push_back(gang_id); None

pub struct HybridScheduler inner: RoundRobinScheduler, gang_sched: GangScheduler, 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() /// Pick the next runnable gang, then return