summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2017-07-14 11:11:13 +0300
committerIvan Maidanski <ivmai@mail.ru>2017-07-14 11:11:13 +0300
commitbd4b25168705ed6c6a10fd418fcc4424b6f90dc8 (patch)
tree3bfa6e360404d133ea452a16dd436a65da29ee0a /finalize.c
parenta9f5b195fa71371d61b840edf4a7e73cf9575333 (diff)
downloadbdwgc-bd4b25168705ed6c6a10fd418fcc4424b6f90dc8.tar.gz
Fix SIGSEGV in GC_is_marked when gc_cleanup is used in leak-finding mode
Issue #162 (bdwgc). Now finalizers and disappearing links registration is a no-op in case of the leak-finding mode. * finalize.c (GC_register_disappearing_link_inner): Do nothing (return GC_UNIMPLEMENTED) if GC_find_leak. * finalize.c (GC_register_finalizer_inner): Do nothing if GC_find_leak. * include/gc.h (GC_find_leak): More verbose comment. * include/gc.h (GC_debug_register_finalizer, GC_general_register_disappearing_link): Document the case of GC_find_leak.
Diffstat (limited to 'finalize.c')
-rw-r--r--finalize.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/finalize.c b/finalize.c
index 4b652790..bd297a9c 100644
--- a/finalize.c
+++ b/finalize.c
@@ -152,6 +152,7 @@ STATIC int GC_register_disappearing_link_inner(
struct disappearing_link * new_dl;
DCL_LOCK_STATE;
+ if (EXPECT(GC_find_leak, FALSE)) return GC_UNIMPLEMENTED;
LOCK();
GC_ASSERT(obj != NULL && GC_base_C(obj) == obj);
if (dl_hashtbl -> log_size == -1
@@ -647,6 +648,7 @@ STATIC void GC_register_finalizer_inner(void * obj,
hdr *hhdr = NULL; /* initialized to prevent warning. */
DCL_LOCK_STATE;
+ if (EXPECT(GC_find_leak, FALSE)) return;
LOCK();
if (log_fo_table_size == -1
|| GC_fo_entries > ((word)1 << log_fo_table_size)) {