summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dbg_mlc.c21
-rw-r--r--finalize.c5
-rw-r--r--include/private/gc_priv.h1
3 files changed, 14 insertions, 13 deletions
diff --git a/dbg_mlc.c b/dbg_mlc.c
index 1ffee0f4..af34b486 100644
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
@@ -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 */
diff --git a/finalize.c b/finalize.c
index 53b1beb6..65ee2701 100644
--- a/finalize.c
+++ b/finalize.c
@@ -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)