diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2023-02-08 21:40:08 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-02-08 21:40:08 +0300 |
commit | 8def379b687d7a059f6e875f2f8fe576fa9a51de (patch) | |
tree | 869f1ae79019239749dadb71279bc7430390e1af /finalize.c | |
parent | e0871911cab3250d2f50e267eb9028db72f8086d (diff) | |
download | bdwgc-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.c | 10 |
1 files changed, 6 insertions, 4 deletions
@@ -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); |