From d197d39d2c7a47709330e9c5867d2746e9a553f2 Mon Sep 17 00:00:00 2001 From: Kevin Tew Date: Thu, 21 Apr 2011 14:22:29 -0600 Subject: [PATCH] [Places] free gcs when places terminate --- src/racket/gc2/newgc.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/racket/gc2/newgc.c b/src/racket/gc2/newgc.c index a7e6f2acd9..20b90d748c 100644 --- a/src/racket/gc2/newgc.c +++ b/src/racket/gc2/newgc.c @@ -2580,6 +2580,7 @@ void GC_destruct_child_gc() { waiting = 1; } } while (waiting == 1); + GC_free_child_gc(); } @@ -4459,6 +4460,35 @@ void GC_dump_variable_stack(void **var_stack, /******************************************************************************/ /* GC free all */ /******************************************************************************/ +void GC_free_child_gc(void) +{ + NewGC *gc = GC_get_GC(); + int i; + mpage *work; + mpage *next; + PageMap pagemap = gc->page_maps; + + gen0_free_big_pages(gc); + + for(i = 0; i < PAGE_TYPES; i++) { + for (work = gc->gen1_pages[i]; work; work = next) { + next = work->next; + + if (work->mprotected) + { + mmu_write_unprotect_page(gc->mmu, work->addr, real_page_size(work)); + } + GCVERBOSEPAGE(gc, "Cleaning up GC DYING", work); + gen1_free_mpage(pagemap, work); + } + } + + free_page_maps(gc->page_maps); + + mmu_flush_freed_pages(gc->mmu); + mmu_free(gc->mmu); + free(gc); +} void GC_free_all(void) {