GC repirs for non-places (and non-future) and backtrace support

Repairs provided by Dmitry Dzhus
This commit is contained in:
Matthew Flatt 2010-07-04 07:36:13 -06:00
parent 99c5fea2fd
commit 608e228530
4 changed files with 17 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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