about summary refs log tree commit diff
path: root/src/rt/rust_sched_loop.cpp
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2012-07-20 18:14:04 -0400
committerBen Blum <bblum@andrew.cmu.edu>2012-07-20 19:23:19 -0400
commit18c645a8839dd86d7f353d0fe98eaf27e246a525 (patch)
treec8a2090a04148c24d97cdd12de8446b26a901624 /src/rt/rust_sched_loop.cpp
parent5bb4a12900969b3250c490a5e0682c658fe65ba8 (diff)
downloadrust-18c645a8839dd86d7f353d0fe98eaf27e246a525.tar.gz
rust-18c645a8839dd86d7f353d0fe98eaf27e246a525.zip
[2/4 for #2365, #2671] Fix exit/kill race with tasks during rust_kernel::fail
Diffstat (limited to 'src/rt/rust_sched_loop.cpp')
-rw-r--r--src/rt/rust_sched_loop.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/rt/rust_sched_loop.cpp b/src/rt/rust_sched_loop.cpp
index aa2c62c630d..7c764921029 100644
--- a/src/rt/rust_sched_loop.cpp
+++ b/src/rt/rust_sched_loop.cpp
@@ -68,11 +68,15 @@ rust_sched_loop::kill_all_tasks() {
         killed = true;
 
         for (size_t i = 0; i < running_tasks.length(); i++) {
-            all_tasks.push_back(running_tasks[i]);
+            rust_task *t = running_tasks[i];
+            t->ref();
+            all_tasks.push_back(t);
         }
 
         for (size_t i = 0; i < blocked_tasks.length(); i++) {
-            all_tasks.push_back(blocked_tasks[i]);
+            rust_task *t = blocked_tasks[i];
+            t->ref();
+            all_tasks.push_back(t);
         }
     }
 
@@ -80,6 +84,7 @@ rust_sched_loop::kill_all_tasks() {
         rust_task *task = all_tasks.back();
         all_tasks.pop_back();
         task->kill();
+        task->deref();
     }
 }