rt: Free all outstanding boxes at task death
This commit is contained in:
parent
106c9faa59
commit
3a7a408386
1
mk/rt.mk
1
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
|
||||
|
15
src/rt/rust_box_annihilator.cpp
Normal file
15
src/rt/rust_box_annihilator.cpp
Normal 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);
|
||||
}
|
||||
}
|
@ -87,12 +87,17 @@ struct cleanup_args {
|
||||
bool threw_exception;
|
||||
};
|
||||
|
||||
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();
|
||||
|
Loading…
Reference in New Issue
Block a user