about summary refs log tree commit diff
path: root/src/rt/rust_task.cpp
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2012-07-12 02:42:56 -0400
committerBen Blum <bblum@andrew.cmu.edu>2012-07-12 18:08:36 -0400
commit200a2ded3245eb0a1ca7b265ce83adba16d75b97 (patch)
tree9874f527ab85ef32d2d9dc813685a1add5a03a51 /src/rt/rust_task.cpp
parent343e9de8ef4ee9727f027c896ce99f09611b9603 (diff)
downloadrust-200a2ded3245eb0a1ca7b265ce83adba16d75b97.tar.gz
rust-200a2ded3245eb0a1ca7b265ce83adba16d75b97.zip
Fix linked failure with root taskgroup to kill the runtime too.
Diffstat (limited to 'src/rt/rust_task.cpp')
-rw-r--r--src/rt/rust_task.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index 3d88c05b3ff..a6c9b791fda 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -129,6 +129,11 @@ 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) {
+        // 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.
+        task->fail_sched_loop();
     }
 
     // FIXME (#2676): For performance we should do the annihilator
@@ -282,6 +287,7 @@ rust_task::kill() {
     LOG(this, task, "preparing to unwind task: 0x%" PRIxPTR, this);
 }
 
+// TODO(bblum): Move this to rust_builtin.cpp (cleanup)
 extern "C" CDECL
 bool rust_task_is_unwinding(rust_task *rt) {
     return rt->unwinding;
@@ -315,10 +321,14 @@ rust_task::begin_failure(char const *expr, char const *file, size_t line) {
 #else
     die();
     // FIXME (#908): Need unwinding on windows. This will end up aborting
-    sched_loop->fail();
+    fail_sched_loop();
 #endif
 }
 
+void rust_task::fail_sched_loop() {
+    sched_loop->fail();
+}
+
 void
 rust_task::unsupervise()
 {