summaryrefslogtreecommitdiff
path: root/reclaim.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-04-01 00:40:12 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-04-01 00:41:21 +0300
commitdbcff3bb14748e6798700f094ccb2771b7160160 (patch)
tree28c4673f75e3fcb5e34f634dc4a191fdf57f65ba /reclaim.c
parent0eb8d2f95c7a683338b9e3c2b55c84aa5edb4bf7 (diff)
downloadbdwgc-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.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/reclaim.c b/reclaim.c
index d3b54a68..c79868cc 100644
--- a/reclaim.c
+++ b/reclaim.c
@@ -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) {