summaryrefslogtreecommitdiff
path: root/dbg_mlc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-01-16 01:02:47 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-01-16 01:02:47 +0300
commite2451af1c6658ac7c68bf01d15daf13bfd79cf76 (patch)
tree77e3cb9d237572d6ed8152b16221a5c911eaebe6 /dbg_mlc.c
parent340ff2d4a174ae4797b145d5f6f268f4c7f32689 (diff)
downloadbdwgc-e2451af1c6658ac7c68bf01d15daf13bfd79cf76.tar.gz
Fix missing lock when GC_generate_random_valid_address is called
Issue #414 (bdwgc). * dbg_mlc.c [KEEP_BACK_PTRS] (GC_generate_random_backtrace_no_gc): Remove definition. * dbg_mlc.c [KEEP_BACK_PTRS] (GC_generate_random_backtrace): Declare current local variable; expand GC_generate_random_backtrace_no_gc() manually. * finalize.c [KEEP_BACK_PTRS] (GC_notify_or_invoke_finalizers): Likewise. * dbg_mlc.c [KEEP_BACK_PTRS] (GC_generate_random_backtrace): Wrap GC_generate_random_valid_address() call into LOCK/UNLOCK. * finalize.c [KEEP_BACK_PTRS] (GC_notify_or_invoke_finalizers): UNLOCK after GC_generate_random_valid_address() call. * include/private/gc_priv.h [KEEP_BACK_PTRS] (GC_generate_random_backtrace_no_gc): Remove declaration.
Diffstat (limited to 'dbg_mlc.c')
-rw-r--r--dbg_mlc.c21
1 files changed, 10 insertions, 11 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 */