summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-07-29 19:43:37 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-08-05 20:21:34 +0300
commit62aa1ab5238880f45d2da32b98189994a393084d (patch)
treec1fd3aed67f8152585f5d7e7f7db8815ca9b4bc1 /include
parent96c09ef22a525eef279eb3f75a77bd5d1c58d472 (diff)
downloadbdwgc-62aa1ab5238880f45d2da32b98189994a393084d.tar.gz
Fix assertion about built-in AO_test_and_set_acquire on sparc64 (gcc-12)
(fix of commit 46a241130) Issue #464 (bdwgc). According to the GCC manual, __atomic_test_and_set() result type is Bool, thus it is not guaranteed to return AO_TS_SET value. (E.g., the function may return 1 while AO_TS_SET is 255, as observed on sparc64 with gcc-12.) * include/private/gc_atomic_ops.h [GC_BUILTIN_ATOMIC] (AO_test_and_set_acquire): Return AO_TS_SET if __atomic_test_and_set() returns true, AO_TS_CLEAR otherwise.
Diffstat (limited to 'include')
-rw-r--r--include/private/gc_atomic_ops.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/include/private/gc_atomic_ops.h b/include/private/gc_atomic_ops.h
index 720c26b8..eaa28cb1 100644
--- a/include/private/gc_atomic_ops.h
+++ b/include/private/gc_atomic_ops.h
@@ -45,7 +45,8 @@
# define AO_TS_SET (AO_TS_t)1 /* true */
# endif
# define AO_CLEAR(p) __atomic_clear(p, __ATOMIC_RELEASE)
-# define AO_test_and_set_acquire(p) __atomic_test_and_set(p, __ATOMIC_ACQUIRE)
+# define AO_test_and_set_acquire(p) \
+ (__atomic_test_and_set(p, __ATOMIC_ACQUIRE) ? AO_TS_SET : AO_TS_CLEAR)
# define AO_HAVE_test_and_set_acquire
# define AO_compiler_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST)