fix backtrace to work with new medium-object pages

svn: r14576
This commit is contained in:
Matthew Flatt 2009-04-21 16:39:13 +00:00
parent 4bc2ddaf9d
commit f86c9e3d85
2 changed files with 56 additions and 2 deletions

View File

@ -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

View File

@ -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));