diff --git a/src/mzscheme/gc2/Makefile.in b/src/mzscheme/gc2/Makefile.in index bdbf6a0a35..7208a49765 100644 --- a/src/mzscheme/gc2/Makefile.in +++ b/src/mzscheme/gc2/Makefile.in @@ -132,7 +132,7 @@ xsrc: xobjects: $(OBJS) main.@LTO@ -XFORMDEP = $(srcdir)/gc2.h $(srcdir)/xform.ss $(srcdir)/xform-mod.ss \ +XFORMDEP = $(srcdir)/gc2.h $(srcdir)/gc2_obj.h $(srcdir)/xform.ss $(srcdir)/xform-mod.ss \ $(srcdir)/precomp.c $(srcdir)/../src/schpriv.h $(srcdir)/../include/scheme.h \ $(srcdir)/../sconfig.h $(srcdir)/../uconfig.h $(srcdir)/../src/schemef.h \ $(srcdir)/../src/stypes.h diff --git a/src/mzscheme/gc2/newgc.c b/src/mzscheme/gc2/newgc.c index 9b4f86061a..129c030cad 100644 --- a/src/mzscheme/gc2/newgc.c +++ b/src/mzscheme/gc2/newgc.c @@ -1020,9 +1020,12 @@ static void backtrace_new_page(NewGC *gc, mpage *page) page->backtrace = (void **)malloc_pages(gc, APAGE_SIZE, APAGE_SIZE); } +# define backtrace_new_page_if_needed(gc, page) if (!page->backtrace) backtrace_new_page(gc, page) + static void free_backtrace(struct mpage *page) { - free_pages(GC, page->backtrace, APAGE_SIZE); + if (page->backtrace) + free_pages(GC, page->backtrace, APAGE_SIZE); } static void *bt_source; @@ -1082,6 +1085,7 @@ static void *get_backtrace(struct mpage *page, void *ptr) #else # define backtrace_new_page(gc, page) /* */ +# define backtrace_new_page_if_needed(gc, page) /* */ # define free_backtrace(page) /* */ # define set_backtrace_source(ptr, type) /* */ # define record_backtrace(page, ptr) /* */ @@ -1792,6 +1796,7 @@ void GC_mark(const void *const_p) info->mark = 1; page->marked_on = 1; p = PTR(NUM(info) + WORD_SIZE); + backtrace_new_page_if_needed(gc, page); record_backtrace(page, p); push_ptr(p); } @@ -2144,6 +2149,31 @@ void GC_dump_with_traces(int flags, } } } + for (i = 0; i < NUM_MED_PAGE_SIZES; i++) { + for (page = gc->med_pages[i]; page; page = page->next) { + void **start = PPTR(NUM(page->addr) + PREFIX_SIZE); + void **end = PPTR(NUM(page->addr) + APAGE_SIZE - page->size); + + while(start <= end) { + struct objhead *info = (struct objhead *)start; + if (!info->dead) { + if (info->type == PAGE_TAGGED) { + unsigned short tag = *(unsigned short *)(start + 1); + if (tag < MAX_DUMP_TAG) { + counts[tag]++; + sizes[tag] += info->size; + } + if (tag == trace_for_tag) { + register_traced_object(start + 1); + if (for_each_found) + for_each_found(start + 1); + } + } + } + start += info->size; + } + } + } GCPRINT(GCOUTF, "Begin MzScheme3m\n"); for (i = 0; i < MAX_DUMP_TAG; i++) { @@ -2175,6 +2205,30 @@ void GC_dump_with_traces(int flags, type_name[i], total_use, count)); } + GCWARN((GCOUTF, "Generation 1 [medium]:")); + for (i = 0; i < NUM_MED_PAGE_SIZES; i++) { + if (gc->med_pages[i]) { + long count = 0, page_count = 0; + for (page = gc->med_pages[i]; page; page = page->next) { + void **start = PPTR(NUM(page->addr) + PREFIX_SIZE); + void **end = PPTR(NUM(page->addr) + APAGE_SIZE - page->size); + + page_count++; + + while(start <= end) { + struct objhead *info = (struct objhead *)start; + if (!info->dead) { + count += info->size; + } + start += info->size; + } + } + GCWARN((GCOUTF, " %li [%li/%li]", count, page_count, gc->med_pages[i]->size)); + } + } + GCWARN((GCOUTF, "\n")); + + GCWARN((GCOUTF,"\n")); GCWARN((GCOUTF,"Current memory use: %li\n", GC_get_memory_use(NULL))); GCWARN((GCOUTF,"Peak memory use after a collection: %li\n", gc->peak_memory_use));