From df2d2604ca8277634df6e38b548aa884ab387963 Mon Sep 17 00:00:00 2001 From: Ben Blum Date: Thu, 12 Jul 2012 19:52:02 -0400 Subject: Reintroduce linked failure This reverts commit acb86921a62ba01726fd922f55d0176fa6c1df7c. --- src/rt/rust_task.cpp | 35 +++++------------------------------ 1 file changed, 5 insertions(+), 30 deletions(-) (limited to 'src/rt/rust_task.cpp') diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index f5e2fcc9a08..d23d74b0ea2 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -10,6 +10,8 @@ #include "rust_env.h" #include "rust_port.h" +// TODO(bblum): get rid of supervisors + // Tasks rust_task::rust_task(rust_sched_loop *sched_loop, rust_task_state state, rust_task *spawner, const char *name, @@ -146,13 +148,9 @@ cleanup_task(cleanup_args *args) { task->notify(!threw_exception); - if (threw_exception) { -#ifndef __WIN32__ - task->conclude_failure(); -#else - assert(false && "Shouldn't happen"); +#ifdef __WIN32__ + assert(!threw_exception && "No exception-handling yet on windows builds"); #endif - } } extern "C" CDECL void upcall_exchange_free(void *ptr); @@ -262,10 +260,7 @@ void rust_task::kill() { scoped_lock with(kill_lock); - if (dead()) { - // Task is already dead, can't kill what's already dead. - fail_parent(); - } + // XXX: bblum: kill/kill race // Note the distinction here: kill() is when you're in an upcall // from task A and want to force-fail task B, you do B->kill(). @@ -314,31 +309,11 @@ rust_task::begin_failure(char const *expr, char const *file, size_t line) { throw this; #else die(); - conclude_failure(); // FIXME (#908): Need unwinding on windows. This will end up aborting sched_loop->fail(); #endif } -void -rust_task::conclude_failure() { - fail_parent(); -} - -void -rust_task::fail_parent() { - scoped_lock with(supervisor_lock); - if (supervisor) { - DLOG(sched_loop, task, - "task %s @0x%" PRIxPTR - " propagating failure to supervisor %s @0x%" PRIxPTR, - name, this, supervisor->name, supervisor); - supervisor->kill(); - } - if (NULL == supervisor && propagate_failure) - sched_loop->fail(); -} - void rust_task::unsupervise() { -- cgit 1.4.1-3-g733a5