aboutsummaryrefslogtreecommitdiff
path: root/src/rt
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-06-25 16:54:03 -0700
committerGraydon Hoare <[email protected]>2010-06-25 16:54:03 -0700
commiteed5c0aa249f3e17bbabeeba1650ab699e3dff5a (patch)
tree0bf4084dcf90be6a889c8283fe6c3dbf775f3491 /src/rt
parentEmit gc glue and rearrange crate glue offsets slightly to have a regular order. (diff)
downloadrust-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.cpp5
-rw-r--r--src/rt/rust_internal.h3
-rw-r--r--src/rt/rust_task.cpp8
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) {