Change from 'spawner' to 'supervisor' in rust_task, and add an unsupervise call.
This commit is contained in:
parent
3175c83ff0
commit
b1eeb9b825
4 changed files with 24 additions and 6 deletions
|
@ -17,5 +17,6 @@ native "rust" mod rustrt {
|
||||||
fn align_of[T]() -> uint;
|
fn align_of[T]() -> uint;
|
||||||
fn refcount[T](@T t) -> uint;
|
fn refcount[T](@T t) -> uint;
|
||||||
fn gc();
|
fn gc();
|
||||||
|
fn unsupervise();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,11 @@ gc(rust_task *task) {
|
||||||
task->gc(1);
|
task->gc(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" CDECL void
|
||||||
|
unsupervise(rust_task *task) {
|
||||||
|
task->unsupervise();
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" CDECL rust_vec*
|
extern "C" CDECL rust_vec*
|
||||||
vec_alloc(rust_task *task, type_desc *t, size_t n_elts)
|
vec_alloc(rust_task *task, type_desc *t, size_t n_elts)
|
||||||
{
|
{
|
||||||
|
|
|
@ -625,7 +625,7 @@ rust_task : public rc_base<rust_task>,
|
||||||
ptr_vec<rust_task> *state;
|
ptr_vec<rust_task> *state;
|
||||||
rust_cond *cond;
|
rust_cond *cond;
|
||||||
uintptr_t* dptr; // Rendezvous pointer for send/recv.
|
uintptr_t* dptr; // Rendezvous pointer for send/recv.
|
||||||
rust_task *spawner; // Parent-link.
|
rust_task *supervisor; // Parent-link for failure propagation.
|
||||||
size_t idx;
|
size_t idx;
|
||||||
size_t gc_alloc_thresh;
|
size_t gc_alloc_thresh;
|
||||||
size_t gc_alloc_accum;
|
size_t gc_alloc_accum;
|
||||||
|
@ -685,6 +685,9 @@ rust_task : public rc_base<rust_task>,
|
||||||
// Run the gc glue on the task stack.
|
// Run the gc glue on the task stack.
|
||||||
void gc(size_t nargs);
|
void gc(size_t nargs);
|
||||||
|
|
||||||
|
// Disconnect from our supervisor.
|
||||||
|
void unsupervise();
|
||||||
|
|
||||||
// Notify tasks waiting for us that we are about to die.
|
// Notify tasks waiting for us that we are about to die.
|
||||||
void notify_waiting_tasks();
|
void notify_waiting_tasks();
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ rust_task::rust_task(rust_dom *dom, rust_task *spawner) :
|
||||||
state(&dom->running_tasks),
|
state(&dom->running_tasks),
|
||||||
cond(NULL),
|
cond(NULL),
|
||||||
dptr(0),
|
dptr(0),
|
||||||
spawner(spawner),
|
supervisor(spawner),
|
||||||
idx(0),
|
idx(0),
|
||||||
waiting_tasks(dom),
|
waiting_tasks(dom),
|
||||||
alarm(this)
|
alarm(this)
|
||||||
|
@ -336,12 +336,12 @@ rust_task::fail(size_t nargs) {
|
||||||
if (this == dom->root_task)
|
if (this == dom->root_task)
|
||||||
dom->fail();
|
dom->fail();
|
||||||
run_after_return(nargs, dom->root_crate->get_unwind_glue());
|
run_after_return(nargs, dom->root_crate->get_unwind_glue());
|
||||||
if (spawner) {
|
if (supervisor) {
|
||||||
dom->log(rust_log::TASK,
|
dom->log(rust_log::TASK,
|
||||||
"task 0x%" PRIxPTR
|
"task 0x%" PRIxPTR
|
||||||
" propagating failure to parent 0x%" PRIxPTR,
|
" propagating failure to supervisor 0x%" PRIxPTR,
|
||||||
this, spawner);
|
this, supervisor);
|
||||||
spawner->kill();
|
supervisor->kill();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -353,6 +353,15 @@ rust_task::gc(size_t nargs)
|
||||||
run_after_return(nargs, dom->root_crate->get_gc_glue());
|
run_after_return(nargs, dom->root_crate->get_gc_glue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rust_task::unsupervise()
|
||||||
|
{
|
||||||
|
dom->log(rust_log::TASK,
|
||||||
|
"task 0x%" PRIxPTR " disconnecting from supervisor 0x%" PRIxPTR,
|
||||||
|
this, supervisor);
|
||||||
|
supervisor = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
rust_task::notify_waiting_tasks()
|
rust_task::notify_waiting_tasks()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue