From a0ad9a42cdfa42d9c4bb51bcc67b9a6bff3b05f4 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 14 Sep 2011 17:05:35 -0700 Subject: [PATCH] Unsupervise tasks before the scheduler kills them. Unblock before yield->fail --- src/rt/rust_scheduler.cpp | 4 ++++ src/rt/rust_task.cpp | 3 +++ src/test/run-fail/linked-failure4.rs | 5 ++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/rt/rust_scheduler.cpp b/src/rt/rust_scheduler.cpp index b127ec77efa..1cbb0fe4565 100644 --- a/src/rt/rust_scheduler.cpp +++ b/src/rt/rust_scheduler.cpp @@ -81,10 +81,14 @@ rust_scheduler::kill_all_tasks() { scoped_lock with(lock); for (size_t i = 0; i < running_tasks.length(); i++) { + // We don't want the failure of these tasks to propagate back + // to the kernel again since we're already failing everything + running_tasks[i]->unsupervise(); running_tasks[i]->kill(); } for (size_t i = 0; i < blocked_tasks.length(); i++) { + blocked_tasks[i]->unsupervise(); blocked_tasks[i]->kill(); } } diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index bb31e4340a5..ffa9e5b7e99 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -255,6 +255,9 @@ rust_task::yield(size_t time_in_us) { name, this, time_in_us); if (killed) { + if (blocked()) { + unblock(); + } killed = false; fail(); } diff --git a/src/test/run-fail/linked-failure4.rs b/src/test/run-fail/linked-failure4.rs index 8030f60c6e8..6d4d387c53d 100644 --- a/src/test/run-fail/linked-failure4.rs +++ b/src/test/run-fail/linked-failure4.rs @@ -1,5 +1,4 @@ // -*- rust -*- -// xfail-test // error-pattern:1 == 2 use std; import std::task; @@ -24,8 +23,8 @@ fn sleeper() { } fn main() { - let f = parent; let g = sleeper; - task::spawn(f); task::spawn(g); + let f = parent; + task::spawn(f); } \ No newline at end of file