From 608e228530d1728de56509cf694af9fac2b3aeb6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 4 Jul 2010 07:36:13 -0600 Subject: [PATCH] GC repirs for non-places (and non-future) and backtrace support Repairs provided by Dmitry Dzhus --- src/racket/gc2/backtrace.c | 6 +++--- src/racket/gc2/newgc.c | 10 +++++++--- src/racket/gc2/newgc.h | 1 + src/racket/gc2/sighand.c | 8 ++++++-- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/racket/gc2/backtrace.c b/src/racket/gc2/backtrace.c index 4f3ecc4090..783a7d9db8 100644 --- a/src/racket/gc2/backtrace.c +++ b/src/racket/gc2/backtrace.c @@ -45,7 +45,7 @@ static void *print_out_pointer(const char *prefix, void *p, trace_page_t *page; const char *what; - page = pagemap_find_page(GC->page_maps, p); + page = pagemap_find_page(GC_instance->page_maps, p); if (!page || (trace_page_type(page) == TRACE_PAGE_BAD)) { GCPRINT(GCOUTF, "%s??? %p\n", prefix, p); return NULL; @@ -94,7 +94,7 @@ static void print_traced_objects(int path_length_limit, GC_print_tagged_value_proc print_tagged_value) { int i; - GC->dumping_avoid_collection++; + GC_instance->dumping_avoid_collection++; GCPRINT(GCOUTF, "Begin Trace\n"); for (i = 0; i < found_object_count; i++) { void *p; @@ -107,5 +107,5 @@ static void print_traced_objects(int path_length_limit, } } GCPRINT(GCOUTF, "End Trace\n"); - --GC->dumping_avoid_collection; + --GC_instance->dumping_avoid_collection; } diff --git a/src/racket/gc2/newgc.c b/src/racket/gc2/newgc.c index d40412f341..3868c24764 100644 --- a/src/racket/gc2/newgc.c +++ b/src/racket/gc2/newgc.c @@ -1448,7 +1448,9 @@ static void backtrace_new_page(NewGC *gc, mpage *page) { /* This is a little wastefull for big pages, because we'll only use the first few words: */ - page->backtrace = (void **)malloc_pages(gc, APAGE_SIZE, APAGE_SIZE, MMU_ZEROED, MMU_BIGMED, MMU_NON_PROTECTABLE, &page->backtrace_page_src); + page->backtrace = (void **)malloc_pages(gc, APAGE_SIZE, APAGE_SIZE, + MMU_ZEROED, MMU_BIG_MED, MMU_NON_PROTECTABLE, + &page->backtrace_page_src); } # define backtrace_new_page_if_needed(gc, page) if (!page->backtrace) backtrace_new_page(gc, page) @@ -1456,7 +1458,9 @@ static void backtrace_new_page(NewGC *gc, mpage *page) static void free_backtrace(mpage *page) { if (page->backtrace) - free_pages(GC, page->backtrace, APAGE_SIZE, MMU_BIG_MED, MMU_NON_PROTECTABLE, &page->backtrace_page_src); + free_pages(GC_instance, page->backtrace, APAGE_SIZE, + MMU_BIG_MED, MMU_NON_PROTECTABLE, + &page->backtrace_page_src); } static void *bt_source; @@ -4143,7 +4147,7 @@ void GC_dump_variable_stack(void **var_stack, stack_get_type_name = get_type_name; stack_get_xtagged_name = get_xtagged_name; stack_print_tagged_value = print_tagged_value; - GC_do_dump_variable_stack(var_stack, delta, limit, stack_mem); + GC_do_dump_variable_stack(var_stack, delta, limit, stack_mem, GC_get_GC()); } #endif diff --git a/src/racket/gc2/newgc.h b/src/racket/gc2/newgc.h index ffe30ff9d5..1d22ce19dc 100644 --- a/src/racket/gc2/newgc.h +++ b/src/racket/gc2/newgc.h @@ -37,6 +37,7 @@ typedef struct mpage { unsigned short live_size; #ifdef MZ_GC_BACKTRACE void **backtrace; + void *backtrace_page_src; #endif void *mmu_src_block; } mpage; diff --git a/src/racket/gc2/sighand.c b/src/racket/gc2/sighand.c index ad756f2725..529ab23a31 100644 --- a/src/racket/gc2/sighand.c +++ b/src/racket/gc2/sighand.c @@ -50,12 +50,16 @@ void fault_handler(int sn, struct siginfo *si, void *ctx) if (c == SEGV_MAPERR) { printf("SIGSEGV MAPERR si_code %i fault on addr %p\n", c, p); } - if (c == 0 ) { - /* I have now idea why this happens on linux */ + if (c == 0) { + /* I have no idea why this happens on linux */ /* supposedly its coming from the user via kill */ /* so just ignore it. */ printf("SIGSEGV SI_USER SI_CODE %i fault on addr %p\n", c, p); +#ifdef MZ_USE_PLACES printf("pid %i uid %i thread %lx\n", si->si_pid, si->si_uid, mz_proc_thread_self()); +#else + printf("pid %i uid %i\n", si->si_pid, si->si_uid); +#endif return; } if (c == 128 ) {