diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-04-01 00:40:12 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-04-01 00:41:21 +0300 |
commit | dbcff3bb14748e6798700f094ccb2771b7160160 (patch) | |
tree | 28c4673f75e3fcb5e34f634dc4a191fdf57f65ba /reclaim.c | |
parent | 0eb8d2f95c7a683338b9e3c2b55c84aa5edb4bf7 (diff) | |
download | bdwgc-dbcff3bb14748e6798700f094ccb2771b7160160.tar.gz |
Eliminate data race reported by TSan in GC_have_errors
* alloc.c (GC_gcollect): Replace read of GC_have_errors with
get_have_errors() call.
* malloc.c (GC_generic_malloc): Likewise.
* mallocx.c (GC_generic_malloc_ignore_off_page,
GC_generic_malloc_many): Likewise.
* reclaim.c (GC_print_all_errors): Likewise.
* dbg_mlc.c [!SHORT_DBG_HDRS] (GC_debug_free, GC_add_smashed): Replace
GC_have_errors=TRUE with GC_SET_HAVE_ERRORS().
* reclaim.c (GC_add_leaked): Likewise.
* include/private/gc_priv.h [AO_HAVE_store] (GC_have_errors): Change
type from GC_bool to volatile AO_t; refine comment.
* reclaim.c [AO_HAVE_store] (GC_have_errors): Likewise.
* include/private/gc_priv.h (GC_SET_HAVE_ERRORS, get_have_errors):
Define macro.
Diffstat (limited to 'reclaim.c')
-rw-r--r-- | reclaim.c | 18 |
1 files changed, 11 insertions, 7 deletions
@@ -45,7 +45,11 @@ GC_INNER signed_word GC_bytes_found = 0; STATIC ptr_t GC_leaked[MAX_LEAKED] = { NULL }; STATIC unsigned GC_n_leaked = 0; -GC_INNER GC_bool GC_have_errors = FALSE; +#ifdef AO_HAVE_store + GC_INNER volatile AO_t GC_have_errors = 0; +#else + GC_INNER GC_bool GC_have_errors = FALSE; +#endif #if !defined(EAGER_SWEEP) && defined(ENABLE_DISCLAIM) STATIC void GC_reclaim_unconditionally_marked(void); @@ -53,12 +57,12 @@ GC_INNER GC_bool GC_have_errors = FALSE; GC_INLINE void GC_add_leaked(ptr_t leaked) { -# ifndef SHORT_DBG_HDRS - if (GC_findleak_delay_free && !GC_check_leaked(leaked)) - return; -# endif +# ifndef SHORT_DBG_HDRS + if (GC_findleak_delay_free && !GC_check_leaked(leaked)) + return; +# endif - GC_have_errors = TRUE; + GC_SET_HAVE_ERRORS(); if (GC_n_leaked < MAX_LEAKED) { GC_leaked[GC_n_leaked++] = leaked; /* Make sure it's not reclaimed this cycle */ @@ -81,7 +85,7 @@ GC_INNER void GC_print_all_errors(void) UNLOCK(); return; } - have_errors = GC_have_errors; + have_errors = get_have_errors(); printing_errors = TRUE; n_leaked = GC_n_leaked; if (n_leaked > 0) { |