in src/runtime/execution.rs [321:345]
fn cleanup() {
// A slightly delicate dance here: we need to drop the tasks from outside of `Self::with`,
// because a task's Drop impl might want to call back into `ExecutionState` (to check
// `should_stop()`). So we pull the tasks out of the `ExecutionState`, leaving it in an
// invalid state, but no one should still be accessing the tasks anyway.
let (mut tasks, final_state) = Self::with(|state| {
assert!(state.current_task == ScheduledTask::Stopped || state.current_task == ScheduledTask::Finished);
(std::mem::replace(&mut state.tasks, SmallVec::new()), state.current_task)
});
for task in tasks.drain(..) {
assert!(
final_state == ScheduledTask::Stopped || task.finished() || task.detached,
"execution finished but task is not"
);
Rc::try_unwrap(task.continuation)
.map_err(|_| ())
.expect("couldn't cleanup a future");
}
while Self::with(|state| state.storage.pop()).is_some() {}
#[cfg(debug_assertions)]
Self::with(|state| state.has_cleaned_up = true);
}