about summary refs log tree commit diff
path: root/src/libstd/rt
diff options
context:
space:
mode:
authorBen Blum <bblum@andrew.cmu.edu>2013-07-31 19:48:38 -0400
committerBen Blum <bblum@andrew.cmu.edu>2013-08-01 17:07:31 -0400
commit963d37e821590b470f7a1fc9cfcda5a5ceceeee4 (patch)
tree0f3fb8984b6e0dc76dad4d64014e8aff2eebb348 /src/libstd/rt
parentaeaed77301397c6ab0c4f5413dbd4b7f0d5b5c9a (diff)
downloadrust-963d37e821590b470f7a1fc9cfcda5a5ceceeee4.tar.gz
rust-963d37e821590b470f7a1fc9cfcda5a5ceceeee4.zip
Temporary workaround to prevent taskgroup cleanup code from failing without an exception handler.
Diffstat (limited to 'src/libstd/rt')
-rw-r--r--src/libstd/rt/kill.rs7
-rw-r--r--src/libstd/rt/task.rs9
2 files changed, 13 insertions, 3 deletions
diff --git a/src/libstd/rt/kill.rs b/src/libstd/rt/kill.rs
index 208af522d80..696f4a8c355 100644
--- a/src/libstd/rt/kill.rs
+++ b/src/libstd/rt/kill.rs
@@ -72,6 +72,7 @@ use either::{Either, Left, Right};
 use option::{Option, Some, None};
 use prelude::*;
 use rt::task::Task;
+use task::spawn::Taskgroup;
 use to_bytes::IterBytes;
 use unstable::atomics::{AtomicUint, Relaxed};
 use unstable::sync::{UnsafeAtomicRcBox, LittleLock};
@@ -474,7 +475,7 @@ impl Death {
     }
 
     /// Collect failure exit codes from children and propagate them to a parent.
-    pub fn collect_failure(&mut self, mut success: bool) {
+    pub fn collect_failure(&mut self, mut success: bool, group: Option<Taskgroup>) {
         // This may run after the task has already failed, so even though the
         // task appears to need to be killed, the scheduler should not fail us
         // when we block to unwrap.
@@ -484,6 +485,10 @@ impl Death {
         rtassert!(self.unkillable == 0);
         self.unkillable = 1;
 
+        // FIXME(#7544): See corresponding fixme at the callsite in task.rs.
+        // NB(#8192): Doesn't work with "let _ = ..."
+        { use util; util::ignore(group); }
+
         // Step 1. Decide if we need to collect child failures synchronously.
         do self.on_exit.take_map |on_exit| {
             if success {
diff --git a/src/libstd/rt/task.rs b/src/libstd/rt/task.rs
index c1b799796d1..f7f1b10e58c 100644
--- a/src/libstd/rt/task.rs
+++ b/src/libstd/rt/task.rs
@@ -129,8 +129,13 @@ impl Task {
         }
 
         self.unwinder.try(f);
-        { let _ = self.taskgroup.take(); }
-        self.death.collect_failure(!self.unwinder.unwinding);
+        // FIXME(#7544): We pass the taskgroup into death so that it can be
+        // dropped while the unkillable counter is set. This should not be
+        // necessary except for an extraneous clone() in task/spawn.rs that
+        // causes a killhandle to get dropped, which mustn't receive a kill
+        // signal since we're outside of the unwinder's try() scope.
+        // { let _ = self.taskgroup.take(); }
+        self.death.collect_failure(!self.unwinder.unwinding, self.taskgroup.take());
         self.destroy();
     }