From cd38377b1b558ebf53a6401b0baf02e0329ba58b Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Fri, 13 Jul 2012 19:13:11 -0400 Subject: Add asserts to check fail_sched_loop() only once --- src/rt/rust_task.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src/rt/rust_task.cpp') diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index a6c9b791fda..db4db51d3cf 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -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 -- cgit 1.4.1-3-g733a5