From 49fbca5b1830bc4bddb8522d7647518227a32dd0 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 4 Jul 2013 09:41:30 -0600 Subject: [PATCH] fix GC bug GC during allocation of a pair, weak box, ephemeron, or weak array went wrong if the GC-notification callback allocated any of those kinds of things. (Bug found by running tests in GC-stress mode.) --- racket/src/racket/gc2/newgc.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/racket/src/racket/gc2/newgc.c b/racket/src/racket/gc2/newgc.c index 597c0367fd..fe3b2392bb 100644 --- a/racket/src/racket/gc2/newgc.c +++ b/racket/src/racket/gc2/newgc.c @@ -4820,10 +4820,23 @@ static void garbage_collect(NewGC *gc, int force_full, int switching_master, Log is_master = (gc == MASTERGC); #endif gc->dumping_avoid_collection++; + + /* Inform might allocate, which might need park: */ + gc->park_save[0] = gc->park[0]; + gc->park_save[1] = gc->park[1]; + gc->park[0] = NULL; + gc->park[1] = NULL; + gc->GC_collect_inform_callback(is_master, gc->gc_full, old_mem_use + old_gen0, gc->memory_in_use, old_mem_allocated, mmu_memory_allocated(gc->mmu), gc->child_gc_total); + + gc->park[0] = gc->park_save[0]; + gc->park[1] = gc->park_save[1]; + gc->park_save[0] = NULL; + gc->park_save[1] = NULL; + --gc->dumping_avoid_collection; } #ifdef MZ_USE_PLACES