rt: Free all outstanding boxes at task death

This commit is contained in:
Brian Anderson 2012-03-23 17:51:54 -07:00
parent 106c9faa59
commit 3a7a408386
3 changed files with 21 additions and 0 deletions

View file

@ -67,6 +67,7 @@ RUNTIME_CS_$(1) := \
rt/rust_abi.cpp \ rt/rust_abi.cpp \
rt/rust_cc.cpp \ rt/rust_cc.cpp \
rt/rust_debug.cpp \ rt/rust_debug.cpp \
rt/rust_box_annihilator.cpp \
rt/memory_region.cpp \ rt/memory_region.cpp \
rt/boxed_region.cpp \ rt/boxed_region.cpp \
rt/arch/$$(HOST_$(1))/context.cpp rt/arch/$$(HOST_$(1))/context.cpp

View file

@ -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);
}
}

View file

@ -87,12 +87,17 @@ struct cleanup_args {
bool threw_exception; bool threw_exception;
}; };
void
annihilate_boxes(rust_task *task);
void void
cleanup_task(cleanup_args *args) { cleanup_task(cleanup_args *args) {
spawn_args *a = args->spargs; spawn_args *a = args->spargs;
bool threw_exception = args->threw_exception; bool threw_exception = args->threw_exception;
rust_task *task = a->task; rust_task *task = a->task;
cc::do_cc(task);
annihilate_boxes(task);
cc::do_final_cc(task); cc::do_final_cc(task);
task->die(); task->die();