GC repirs for non-places (and non-future) and backtrace support
Repairs provided by Dmitry Dzhus
This commit is contained in:
parent
99c5fea2fd
commit
608e228530
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 ) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user