Add asserts to check fail_sched_loop() only once

This commit is contained in:
Ben Blum
2012-07-13 19:13:11 -04:00
parent 1c0b457853
commit cd38377b1b
4 changed files with 15 additions and 3 deletions

View File

@@ -129,11 +129,17 @@ cleanup_task(cleanup_args *args) {
// assert(task->task_local_data != NULL);
task->task_local_data_cleanup(task->task_local_data);
task->task_local_data = NULL;
} else if (threw_exception) {
} else if (threw_exception && task->id == INIT_TASK_ID) {
// Edge case: If main never spawns any tasks, but fails anyway, TLS
// won't be around to take down the kernel (task.rs:kill_taskgroup,
// rust_task_kill_all). Do it here instead.
// (Note that children tasks can not init their TLS if they were
// killed too early, so we need to check main's task id too.)
task->fail_sched_loop();
// This must not happen twice.
static bool main_task_failed_without_spawning = false;
assert(!main_task_failed_without_spawning);
main_task_failed_without_spawning = true;
}
// FIXME (#2676): For performance we should do the annihilator