diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2017-07-14 11:11:13 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2017-07-14 11:11:13 +0300 |
commit | bd4b25168705ed6c6a10fd418fcc4424b6f90dc8 (patch) | |
tree | 3bfa6e360404d133ea452a16dd436a65da29ee0a /finalize.c | |
parent | a9f5b195fa71371d61b840edf4a7e73cf9575333 (diff) | |
download | bdwgc-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.c | 2 |
1 files changed, 2 insertions, 0 deletions
@@ -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)) { |