summaryrefslogtreecommitdiff
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
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.
-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)