=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/gc/reclaim.c,v retrieving revision 1.7 retrieving revision 1.9 diff -u -p -r1.7 -r1.9 --- OpenXM_contrib2/asir2000/gc/reclaim.c 2002/07/24 08:00:11 1.7 +++ OpenXM_contrib2/asir2000/gc/reclaim.c 2003/06/24 05:11:34 1.9 @@ -27,23 +27,61 @@ signed_word GC_mem_found = 0; /* nonzero. */ #endif /* PARALLEL_MARK */ -static void report_leak(p, sz) -ptr_t p; -word sz; +/* We defer printing of leaked objects until we're done with the GC */ +/* cycle, since the routine for printing objects needs to run outside */ +/* the collector, e.g. without the allocation lock. */ +#define MAX_LEAKED 40 +ptr_t GC_leaked[MAX_LEAKED]; +unsigned GC_n_leaked = 0; + +GC_bool GC_have_errors = FALSE; + +void GC_add_leaked(leaked) +ptr_t leaked; { - if (HDR(p) -> hb_obj_kind == PTRFREE) { - GC_err_printf0("Leaked atomic object at "); - } else { - GC_err_printf0("Leaked composite object at "); + if (GC_n_leaked < MAX_LEAKED) { + GC_have_errors = TRUE; + GC_leaked[GC_n_leaked++] = leaked; + /* Make sure it's not reclaimed this cycle */ + GC_set_mark_bit(leaked); } - GC_print_heap_obj(p); - GC_err_printf0("\n"); } +static GC_bool printing_errors = FALSE; +/* Print all objects on the list after printing any smashed objs. */ +/* Clear both lists. */ +void GC_print_all_errors () +{ + unsigned i; + + LOCK(); + if (printing_errors) { + UNLOCK(); + return; + } + printing_errors = TRUE; + UNLOCK(); + if (GC_debugging_started) GC_print_all_smashed(); + for (i = 0; i < GC_n_leaked; ++i) { + ptr_t p = GC_leaked[i]; + if (HDR(p) -> hb_obj_kind == PTRFREE) { + GC_err_printf0("Leaked atomic object at "); + } else { + GC_err_printf0("Leaked composite object at "); + } + GC_print_heap_obj(p); + GC_err_printf0("\n"); + GC_free(p); + GC_leaked[i] = 0; + } + GC_n_leaked = 0; + printing_errors = FALSE; +} + + # define FOUND_FREE(hblk, word_no) \ { \ - report_leak((ptr_t)hblk + WORDS_TO_BYTES(word_no), \ - HDR(hblk) -> hb_sz); \ + GC_add_leaked((ptr_t)hblk + WORDS_TO_BYTES(word_no)); \ } /* @@ -866,7 +904,7 @@ void GC_print_block_list() * Clear *flp. * This must be done before dropping a list of free gcj-style objects, * since may otherwise end up with dangling "descriptor" pointers. - * It may help for other pointer-containg objects. + * It may help for other pointer-containing objects. */ void GC_clear_fl_links(flp) ptr_t *flp; @@ -992,7 +1030,8 @@ GC_bool ignore_old; GET_TIME(start_time); # endif - + GC_timerstart(); + for (kind = 0; kind < GC_n_kinds; kind++) { ok = &(GC_obj_kinds[kind]); rlp = ok -> ok_reclaim_list; @@ -1014,6 +1053,7 @@ GC_bool ignore_old; } } } + GC_timerstop(); # ifdef PRINTTIMES GET_TIME(done_time); GC_printf1("Disposing of reclaim lists took %lu msecs\n",