fn next_task()

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)
    }