diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-01-16 01:02:47 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-01-16 01:02:47 +0300 |
commit | e2451af1c6658ac7c68bf01d15daf13bfd79cf76 (patch) | |
tree | 77e3cb9d237572d6ed8152b16221a5c911eaebe6 /dbg_mlc.c | |
parent | 340ff2d4a174ae4797b145d5f6f268f4c7f32689 (diff) | |
download | bdwgc-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.c | 21 |
1 files changed, 10 insertions, 11 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 */ |