diff options
| author | Graydon Hoare <[email protected]> | 2010-06-25 16:54:03 -0700 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2010-06-25 16:54:03 -0700 |
| commit | eed5c0aa249f3e17bbabeeba1650ab699e3dff5a (patch) | |
| tree | 0bf4084dcf90be6a889c8283fe6c3dbf775f3491 /src/rt | |
| parent | Emit gc glue and rearrange crate glue offsets slightly to have a regular order. (diff) | |
| download | rust-eed5c0aa249f3e17bbabeeba1650ab699e3dff5a.tar.xz rust-eed5c0aa249f3e17bbabeeba1650ab699e3dff5a.zip | |
Add rust_task::gc(size_t args) method that drops us back into the GC glue.
Diffstat (limited to 'src/rt')
| -rw-r--r-- | src/rt/rust_crate.cpp | 5 | ||||
| -rw-r--r-- | src/rt/rust_internal.h | 3 | ||||
| -rw-r--r-- | src/rt/rust_task.cpp | 8 |
3 files changed, 16 insertions, 0 deletions
diff --git a/src/rt/rust_crate.cpp b/src/rt/rust_crate.cpp index d609ac64..36978270 100644 --- a/src/rt/rust_crate.cpp +++ b/src/rt/rust_crate.cpp @@ -27,6 +27,11 @@ rust_crate::get_unwind_glue() const { } uintptr_t +rust_crate::get_gc_glue() const { + return ((uintptr_t)this + gc_glue_off); +} + +uintptr_t rust_crate::get_yield_glue() const { return ((uintptr_t)this + yield_glue_off); } diff --git a/src/rt/rust_internal.h b/src/rt/rust_internal.h index 3c4fde2a..7f703012 100644 --- a/src/rt/rust_internal.h +++ b/src/rt/rust_internal.h @@ -660,6 +660,9 @@ rust_task : public rc_base<rust_task>, // Fail self, assuming caller-on-stack is this task. void fail(size_t nargs); + // Run the gc glue on the task stack. + void gc(size_t nargs); + // Notify tasks waiting for us that we are about to die. void notify_waiting_tasks(); diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index beba11a0..3f85f51a 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -346,6 +346,14 @@ rust_task::fail(size_t nargs) { } void +rust_task::gc(size_t nargs) +{ + dom->log(rust_log::TASK|rust_log::MEM, + "task 0x%" PRIxPTR " garbage collecting", this); + run_after_return(nargs, dom->root_crate->get_gc_glue()); +} + +void rust_task::notify_waiting_tasks() { while (waiting_tasks.length() > 0) { |