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