summaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gc.c b/gc.c
index b515842d..44ec51a9 100644
--- a/gc.c
+++ b/gc.c
@@ -936,3 +936,43 @@ void gc_report_copies(val *pvar)
convert(int, pvar - opvar));
}
}
+
+void gc_free_all(void)
+{
+ {
+ heap_t *iter = heap_list;
+
+ while (iter) {
+ heap_t *next = iter->next;
+ obj_t *block, *end;
+
+#if HAVE_VALGRIND
+ if (opt_vg_debug)
+ VALGRIND_MAKE_MEM_DEFINED(&next->block, sizeof next->block);
+#endif
+
+ for (block = iter->block, end = iter->block + HEAP_SIZE;
+ block < end;
+ block++)
+ {
+ type_t t = block->t.type;
+ if ((t & FREE) != 0)
+ continue;
+ finalize(block);
+ }
+
+ free(iter);
+ iter = next;
+ }
+ }
+
+ {
+ struct fin_reg *iter = final_list;
+
+ while (iter) {
+ struct fin_reg *next = iter->next;
+ free(iter);
+ iter = next;
+ }
+ }
+}