From 8def379b687d7a059f6e875f2f8fe576fa9a51de Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Wed, 8 Feb 2023 21:40:08 +0300 Subject: 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. --- finalize.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'finalize.c') 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); -- cgit v1.2.1