in src/scheduler/dfs.rs [69:98]
fn next_task(&mut self, runnable: &[TaskId], _current: Option<TaskId>, _is_yielding: bool) -> Option<TaskId> {
let next = if self.steps >= self.levels.len() {
// First time we've reached this level
assert_eq!(self.steps, self.levels.len());
let to_run = runnable.first().unwrap();
self.levels.push((*to_run, runnable.len() == 1));
*to_run
} else {
let (last_choice, was_last) = self.levels[self.steps];
if self.has_more_choices(self.steps + 1) {
// Keep the same choice, because there's more work to do somewhere below us
last_choice
} else {
// Time to make a change at this level
assert!(
!was_last,
"if we are making a change, there should be another available option"
);
let next_idx = runnable.iter().position(|tid| *tid == last_choice).unwrap() + 1;
let next = runnable[next_idx];
self.levels.drain(self.steps..);
self.levels.push((next, next_idx == runnable.len() - 1));
next
}
};
self.steps += 1;
Some(next)
}