diff --git a/src/mzscheme/gc2/fnls.c b/src/mzscheme/gc2/fnls.c index e0b95bd8c8..18f0352eaa 100644 --- a/src/mzscheme/gc2/fnls.c +++ b/src/mzscheme/gc2/fnls.c @@ -81,16 +81,16 @@ void GC_set_finalizer(void *p, int tagged, int level, void (*f)(void *p, void *d return; /* Allcation might trigger GC, so we use park: */ - park[0] = p; - park[1] = data; + GC->park[0] = p; + GC->park[1] = data; fnl = (Fnl *)GC_malloc_atomic(sizeof(Fnl)); memset(fnl, 0, sizeof(Fnl)); - p = park[0]; - park[0] = NULL; - data = park[1]; - park[1] = NULL; + p = GC->park[0]; + data = GC->park[1]; + GC->park[0] = NULL; + GC->park[1] = NULL; fnl->next = finalizers; fnl->prev = NULL; diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index 844548c6bc..4f2f440543 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -110,9 +110,6 @@ void (*GC_fixup_xtagged)(void *obj); #include "my_qsort.c" -static void *park[2]; -static void *park_save[2]; - /*****************************************************************************/ /* OS-Level Memory Management Routines */ /*****************************************************************************/ @@ -1108,8 +1105,8 @@ void GC_finalization_weak_ptr(void **p, int offset) { struct weak_finalizer *wfnl; - park[0] = p; wfnl = GC_malloc_atomic(sizeof(struct weak_finalizer)); - p = park[0]; park[0] = NULL; + GC->park[0] = p; wfnl = GC_malloc_atomic(sizeof(struct weak_finalizer)); + p = GC->park[0]; GC->park[0] = NULL; wfnl->p = p; wfnl->offset = offset * sizeof(void*); wfnl->saved = NULL; wfnl->next = weak_finalizers; weak_finalizers = wfnl; } @@ -1471,8 +1468,8 @@ void GC_init_type_tags(int count, int pair, int mutable_pair, int weakbox, int e GC_register_traversers(GC->ephemeron_tag, size_ephemeron, mark_ephemeron, fixup_ephemeron, 0, 0); GC_register_traversers(GC->weak_array_tag, size_weak_array, mark_weak_array, fixup_weak_array, 0, 0); initialize_signal_handler(); - GC_add_roots(&park, (char *)&park + sizeof(park) + 1); - GC_add_roots(&park_save, (char *)&park_save + sizeof(park_save) + 1); + GC_add_roots(&GC->park, (char *)&GC->park + sizeof(GC->park) + 1); + GC_add_roots(&GC->park_save, (char *)&GC->park_save + sizeof(GC->park_save) + 1); initialize_protect_page_ranges(malloc_dirty_pages(APAGE_SIZE, APAGE_SIZE), APAGE_SIZE); } @@ -2560,10 +2557,10 @@ static void garbage_collect(int force_full) running_finalizers = 1; /* Finalization might allocate, which might need park: */ - park_save[0] = park[0]; - park_save[1] = park[1]; - park[0] = NULL; - park[1] = NULL; + GC->park_save[0] = GC->park[0]; + GC->park_save[1] = GC->park[1]; + GC->park[0] = NULL; + GC->park[1] = NULL; while(run_queue) { struct finalizer *f; @@ -2581,10 +2578,10 @@ static void garbage_collect(int force_full) run_account_hooks(); running_finalizers = 0; - park[0] = park_save[0]; - park[1] = park_save[1]; - park_save[0] = NULL; - park_save[1] = NULL; + GC->park[0] = GC->park_save[0]; + GC->park[1] = GC->park_save[1]; + GC->park_save[0] = NULL; + GC->park_save[1] = NULL; } DUMP_HEAP(); CLOSE_DEBUG_FILE(); diff --git a/src/mzscheme/gc2/newgc_internal.h b/src/mzscheme/gc2/newgc_internal.h index f664506425..f4167136b4 100644 --- a/src/mzscheme/gc2/newgc_internal.h +++ b/src/mzscheme/gc2/newgc_internal.h @@ -82,6 +82,19 @@ typedef struct NewGC { unsigned long in_unsafe_allocation_mode :1; void (*unsafe_allocation_abort)(); + void *park[2]; + void *park_save[2]; + + int generations_available; + unsigned char full_needed_for_finalization :1; + unsigned char no_further_modifications:1; + + /* These collect information about memory usage, for use in GC_dump. */ + unsigned long peak_memory_use; + unsigned long num_minor_collects; + unsigned long num_major_collects; + + unsigned short weak_array_tag; unsigned short weak_box_tag; unsigned short ephemeron_tag; @@ -114,4 +127,5 @@ void NewGC_initialize(NewGC *newgc) { newgc->weak_boxes = NULL; newgc->ephemerons = NULL; newgc->num_last_seen_ephemerons = 0; + newgc->generations_available = 1; } diff --git a/src/mzscheme/gc2/newgc_parts/blame_the_child.c b/src/mzscheme/gc2/newgc_parts/blame_the_child.c index 6132a19045..3d61d97bd4 100644 --- a/src/mzscheme/gc2/newgc_parts/blame_the_child.c +++ b/src/mzscheme/gc2/newgc_parts/blame_the_child.c @@ -146,11 +146,11 @@ inline static unsigned long custodian_usage(void *custodian) int i; if(!really_doing_accounting) { - park[0] = custodian; + GC->park[0] = custodian; really_doing_accounting = 1; garbage_collect(1); - custodian = park[0]; - park[0] = NULL; + custodian = GC->park[0]; + GC->park[0] = NULL; } for(i = 1; i < owner_table_top; i++) if(owner_table[i] && custodian_member_owner_set(custodian, i)) @@ -359,11 +359,11 @@ inline static void add_account_hook(int type,void *c1,void *c2,unsigned long b) struct account_hook *work; if(!really_doing_accounting) { - park[0] = c1; park[1] = c2; + GC->park[0] = c1; GC->park[1] = c2; really_doing_accounting = 1; garbage_collect(1); - c1 = park[0]; c2 = park[1]; - park[0] = park[1] = NULL; + c1 = GC->park[0]; c2 = GC->park[1]; + GC->park[0] = GC->park[1] = NULL; } if (type == MZACCT_LIMIT) diff --git a/src/mzscheme/gc2/weak.c b/src/mzscheme/gc2/weak.c index 1397ae8963..8c2299d8aa 100644 --- a/src/mzscheme/gc2/weak.c +++ b/src/mzscheme/gc2/weak.c @@ -88,14 +88,14 @@ void *GC_malloc_weak_array(size_t size_in_bytes, void *replace_val) GC_Weak_Array *w; /* Allcation might trigger GC, so we use park: */ - park[0] = replace_val; + GC->park[0] = replace_val; w = (GC_Weak_Array *)GC_malloc_one_tagged(size_in_bytes + sizeof(GC_Weak_Array) - sizeof(void *)); - replace_val = park[0]; - park[0] = NULL; + replace_val = GC->park[0]; + GC->park[0] = NULL; w->type = GC->weak_array_tag; w->replace_val = replace_val; @@ -168,15 +168,15 @@ void *GC_malloc_weak_box(void *p, void **secondary, int soffset) GC_Weak_Box *w; /* Allcation might trigger GC, so we use park: */ - park[0] = p; - park[1] = secondary; + GC->park[0] = p; + GC->park[1] = secondary; w = (GC_Weak_Box *)GC_malloc_one_tagged(sizeof(GC_Weak_Box)); - p = park[0]; - park[0] = NULL; - secondary = (void **)park[1]; - park[1] = NULL; + p = GC->park[0]; + secondary = (void **)GC->park[1]; + GC->park[0] = NULL; + GC->park[1] = NULL; w->type = GC->weak_box_tag; w->val = p; @@ -262,15 +262,15 @@ void *GC_malloc_ephemeron(void *k, void *v) GC_Ephemeron *eph; /* Allcation might trigger GC, so we use park: */ - park[0] = k; - park[1] = v; + GC->park[0] = k; + GC->park[1] = v; eph = (GC_Ephemeron *)GC_malloc_one_tagged(sizeof(GC_Ephemeron)); - k = park[0]; - park[0] = NULL; - v = park[1]; - park[1] = NULL; + k = GC->park[0]; + v = GC->park[1]; + GC->park[0] = NULL; + GC->park[1] = NULL; eph->type = GC->ephemeron_tag; eph->key = k;