version 1.8, 2002/07/24 09:44:21 |
version 1.9, 2003/06/24 05:11:34 |
Line 27 signed_word GC_mem_found = 0; |
|
Line 27 signed_word GC_mem_found = 0; |
|
/* nonzero. */ |
/* nonzero. */ |
#endif /* PARALLEL_MARK */ |
#endif /* PARALLEL_MARK */ |
|
|
static void report_leak(p, sz) |
/* We defer printing of leaked objects until we're done with the GC */ |
ptr_t p; |
/* cycle, since the routine for printing objects needs to run outside */ |
word sz; |
/* 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) { |
if (GC_n_leaked < MAX_LEAKED) { |
GC_err_printf0("Leaked atomic object at "); |
GC_have_errors = TRUE; |
} else { |
GC_leaked[GC_n_leaked++] = leaked; |
GC_err_printf0("Leaked composite object at "); |
/* 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) \ |
# define FOUND_FREE(hblk, word_no) \ |
{ \ |
{ \ |
report_leak((ptr_t)hblk + WORDS_TO_BYTES(word_no), \ |
GC_add_leaked((ptr_t)hblk + WORDS_TO_BYTES(word_no)); \ |
HDR(hblk) -> hb_sz); \ |
|
} |
} |
|
|
/* |
/* |
Line 866 void GC_print_block_list() |
|
Line 904 void GC_print_block_list() |
|
* Clear *flp. |
* Clear *flp. |
* This must be done before dropping a list of free gcj-style objects, |
* This must be done before dropping a list of free gcj-style objects, |
* since may otherwise end up with dangling "descriptor" pointers. |
* 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) |
void GC_clear_fl_links(flp) |
ptr_t *flp; |
ptr_t *flp; |