diff options
| author | Ben Blum <bblum@andrew.cmu.edu> | 2012-07-12 02:42:56 -0400 |
|---|---|---|
| committer | Ben Blum <bblum@andrew.cmu.edu> | 2012-07-12 18:08:36 -0400 |
| commit | 200a2ded3245eb0a1ca7b265ce83adba16d75b97 (patch) | |
| tree | 9874f527ab85ef32d2d9dc813685a1add5a03a51 /src/rt/rust_task.cpp | |
| parent | 343e9de8ef4ee9727f027c896ce99f09611b9603 (diff) | |
| download | rust-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.cpp | 12 |
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() { |
