about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-03-23 17:51:54 -0700
committerBrian Anderson <banderson@mozilla.com>2012-03-29 16:43:18 -0700
commit3a7a408386b8b1fbeb82cf6d695a168296c02793 (patch)
treed4716b29380eb27c3b361bd8ed12a3a22d1aa5d5
parent106c9faa59c1a605d7e0d67da5b45d24863ec009 (diff)
rt: Free all outstanding boxes at task death
-rw-r--r--mk/rt.mk1
-rw-r--r--src/rt/rust_box_annihilator.cpp15
-rw-r--r--src/rt/rust_task.cpp5
3 files changed, 21 insertions, 0 deletions
diff --git a/mk/rt.mk b/mk/rt.mk
index c0223070e57..2eaa784e191 100644
--- a/mk/rt.mk
+++ b/mk/rt.mk
@@ -67,6 +67,7 @@ RUNTIME_CS_$(1) := \
               rt/rust_abi.cpp \
               rt/rust_cc.cpp \
               rt/rust_debug.cpp \
+              rt/rust_box_annihilator.cpp \
               rt/memory_region.cpp \
               rt/boxed_region.cpp \
               rt/arch/$$(HOST_$(1))/context.cpp
diff --git a/src/rt/rust_box_annihilator.cpp b/src/rt/rust_box_annihilator.cpp
new file mode 100644
index 00000000000..29c69aa1766
--- /dev/null
+++ b/src/rt/rust_box_annihilator.cpp
@@ -0,0 +1,15 @@
+#include "rust_internal.h"
+#include "rust_shape.h"
+
+void
+annihilate_boxes(rust_task *task) {
+    LOG(task, gc, "annihilating boxes for task %p", task);
+
+    boxed_region *boxed = &task->boxed;
+    rust_opaque_box *box = boxed->first_live_alloc();
+    while (box != NULL) {
+        rust_opaque_box *tmp = box;
+        box = box->next;
+        boxed->free(tmp);
+    }
+}
diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp
index b06a2b2d8b7..de3069ddf58 100644
--- a/src/rt/rust_task.cpp
+++ b/src/rt/rust_task.cpp
@@ -88,11 +88,16 @@ struct cleanup_args {
 };
 
 void
+annihilate_boxes(rust_task *task);
+
+void
 cleanup_task(cleanup_args *args) {
     spawn_args *a = args->spargs;
     bool threw_exception = args->threw_exception;
     rust_task *task = a->task;
 
+    cc::do_cc(task);
+    annihilate_boxes(task);
     cc::do_final_cc(task);
 
     task->die();