diff options
-rw-r--r-- | dbg_mlc.c | 21 | ||||
-rw-r--r-- | finalize.c | 5 | ||||
-rw-r--r-- | include/private/gc_priv.h | 1 |
3 files changed, 14 insertions, 13 deletions
@@ -245,24 +245,23 @@ out:; } - /* Force a garbage collection and generate/print a backtrace */ - /* from a random heap address. */ - GC_INNER void GC_generate_random_backtrace_no_gc(void) - { - void * current; - current = GC_generate_random_valid_address(); - GC_printf("\n****Chosen address %p in object\n", current); - GC_print_backtrace(current); - } - GC_API void GC_CALL GC_generate_random_backtrace(void) { + void *current; + DCL_LOCK_STATE; + if (GC_try_to_collect(GC_never_stop_func) == 0) { GC_err_printf("Cannot generate a backtrace: " "garbage collection is disabled!\n"); return; } - GC_generate_random_backtrace_no_gc(); + + /* Generate/print a backtrace from a random heap address. */ + LOCK(); + current = GC_generate_random_valid_address(); + UNLOCK(); + GC_printf("\n****Chosen address %p in object\n", current); + GC_print_backtrace(current); } #endif /* KEEP_BACK_PTRS */ @@ -1303,8 +1303,11 @@ GC_INNER void GC_notify_or_invoke_finalizers(void) /* which may cause occasional mysterious results. */ /* We need to release the GC lock, since GC_print_callers */ /* acquires it. It probably shouldn't. */ + void *current = GC_generate_random_valid_address(); + UNLOCK(); - GC_generate_random_backtrace_no_gc(); + GC_printf("\n****Chosen address %p in object\n", current); + GC_print_backtrace(current); LOCK(); } last_back_trace_gc_no = GC_gc_no; diff --git a/include/private/gc_priv.h b/include/private/gc_priv.h index 74e6c8c9..7b6155ae 100644 --- a/include/private/gc_priv.h +++ b/include/private/gc_priv.h @@ -2355,7 +2355,6 @@ GC_EXTERN GC_bool GC_have_errors; /* We saw a smashed or leaked object. */ #ifdef KEEP_BACK_PTRS GC_EXTERN long GC_backtraces; - GC_INNER void GC_generate_random_backtrace_no_gc(void); #endif #if defined(THREADS) || defined(LINT2) |