summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-02-08 21:40:08 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-02-08 21:40:08 +0300
commit8def379b687d7a059f6e875f2f8fe576fa9a51de (patch)
tree869f1ae79019239749dadb71279bc7430390e1af /finalize.c
parente0871911cab3250d2f50e267eb9028db72f8086d (diff)
downloadbdwgc-8def379b687d7a059f6e875f2f8fe576fa9a51de.tar.gz
Eliminate data race FP reported in need_unreachable_finalization by TSan
* finalize.c (need_unreachable_finalization): Move definition upper to be before GC_register_finalizer_inner; add TODO item. * finalize.c (GC_register_finalizer_inner): Set need_unreachable_finalization to true (after LOCK) if mp points to GC_unreachable_finalize_mark_proc. * finalize.c (GC_register_finalizer_unreachable): Do not set need_unreachable_finalization.
Diffstat (limited to 'finalize.c')
-rw-r--r--finalize.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/finalize.c b/finalize.c
index 62ec894c..10c6ffb5 100644
--- a/finalize.c
+++ b/finalize.c
@@ -660,6 +660,10 @@ STATIC void GC_unreachable_finalize_mark_proc(ptr_t p)
GC_normal_finalize_mark_proc(p);
}
+static GC_bool need_unreachable_finalization = FALSE;
+ /* Avoid the work if this is not used. */
+ /* TODO: turn need_unreachable_finalization into a counter */
+
/* Register a finalization function. See gc.h for details. */
/* The last parameter is a procedure that determines */
/* marking for finalization ordering. Any objects marked */
@@ -682,6 +686,8 @@ STATIC void GC_register_finalizer_inner(void * obj,
}
LOCK();
GC_ASSERT(obj != NULL && GC_base_C(obj) == obj);
+ if (mp == GC_unreachable_finalize_mark_proc)
+ need_unreachable_finalization = TRUE;
if (EXPECT(NULL == GC_fnlz_roots.fo_head, FALSE)
|| EXPECT(GC_fo_entries > ((word)1 << GC_log_fo_table_size), FALSE)) {
GC_grow_table((struct hash_chain_entry ***)&GC_fnlz_roots.fo_head,
@@ -823,14 +829,10 @@ GC_API void GC_CALL GC_register_finalizer_no_order(void * obj,
ocd, GC_null_finalize_mark_proc);
}
-static GC_bool need_unreachable_finalization = FALSE;
- /* Avoid the work if this isn't used. */
-
GC_API void GC_CALL GC_register_finalizer_unreachable(void * obj,
GC_finalization_proc fn, void * cd,
GC_finalization_proc *ofn, void ** ocd)
{
- need_unreachable_finalization = TRUE;
GC_ASSERT(GC_java_finalization);
GC_register_finalizer_inner(obj, fn, cd, ofn,
ocd, GC_unreachable_finalize_mark_proc);