diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2022-07-29 19:43:37 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-08-05 20:21:34 +0300 |
commit | 62aa1ab5238880f45d2da32b98189994a393084d (patch) | |
tree | c1fd3aed67f8152585f5d7e7f7db8815ca9b4bc1 /include | |
parent | 96c09ef22a525eef279eb3f75a77bd5d1c58d472 (diff) | |
download | bdwgc-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.h | 3 |
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) |