Fix run-fail/spawnfail

Catch the case where a parent is killed immediately before it terminates
normally.
This commit is contained in:
Brian Anderson 2011-11-11 14:19:15 -08:00
parent fcdb313bd5
commit 07771ec25b
2 changed files with 11 additions and 6 deletions

View File

@ -191,6 +191,13 @@ void task_start_wrapper(spawn_args *a)
task->free(env);
}
task->die();
if (task->killed && !failed) {
LOG(task, task, "Task killed during termination");
failed = true;
}
if (failed) {
#ifndef __WIN32__
task->conclude_failure();
@ -198,7 +205,6 @@ void task_start_wrapper(spawn_args *a)
A(task->sched, false, "Shouldn't happen");
#endif
} else {
task->die();
task->lock.lock();
task->notify_tasks_waiting_to_join();
task->lock.unlock();
@ -316,13 +322,13 @@ rust_task::fail() {
#ifndef __WIN32__
throw this;
#else
die();
conclude_failure();
#endif
}
void
rust_task::conclude_failure() {
die();
// Unblock the task so it can unwind.
unblock();
fail_parent();

View File

@ -1,13 +1,12 @@
// xfail-test
// xfail-win32
// error-pattern:explicit
use std;
import std::task;
// We don't want to see any invalid reads
fn main() {
fn f() {
fn f(&&_i: ()) {
fail;
}
let g = f;
task::spawn(g);
task::spawn((), f);
}