# endif
GC_have_errors = TRUE;
- /* FIXME: Prevent adding an object while printing leaked ones. */
if (GC_n_leaked < MAX_LEAKED) {
GC_leaked[GC_n_leaked++] = leaked;
/* Make sure it's not reclaimed this cycle */
{
static GC_bool printing_errors = FALSE;
GC_bool have_errors;
- unsigned i;
+ unsigned i, n_leaked;
+ ptr_t leaked[MAX_LEAKED];
DCL_LOCK_STATE;
LOCK();
}
have_errors = GC_have_errors;
printing_errors = TRUE;
+ n_leaked = GC_n_leaked;
+ GC_ASSERT(n_leaked <= MAX_LEAKED);
+ BCOPY(GC_leaked, leaked, n_leaked * sizeof(ptr_t));
+ GC_n_leaked = 0;
+ BZERO(GC_leaked, n_leaked * sizeof(ptr_t));
UNLOCK();
if (GC_debugging_started) {
have_errors = FALSE;
}
- if (GC_n_leaked > 0) {
- GC_err_printf("Found %u leaked objects:\n", GC_n_leaked);
+ if (n_leaked > 0) {
+ GC_err_printf("Found %u leaked objects:\n", n_leaked);
have_errors = TRUE;
}
- for (i = 0; i < GC_n_leaked; ++i) {
- ptr_t p = GC_leaked[i];
+ for (i = 0; i < n_leaked; i++) {
+ ptr_t p = leaked[i];
GC_print_heap_obj(p);
GC_free(p);
- GC_leaked[i] = 0;
}
- GC_n_leaked = 0;
if (have_errors
# ifndef GC_ABORT_ON_LEAK
ABORT("Leaked or smashed objects encountered");
}
+ LOCK();
printing_errors = FALSE;
+ UNLOCK();
}