aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2019-02-06 20:46:00 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-02-06 20:46:00 +0000
commit73fe55d7522864d20026dc8d427026dc4078f9cc (patch)
treee70328d426f425d14f9064eb8c7cc43c12f1772f /libgo
parent16e2bcd5b9371ca6062bf035bc1d6b88540841d1 (diff)
downloadgcc-73fe55d7522864d20026dc8d427026dc4078f9cc.zip
gcc-73fe55d7522864d20026dc8d427026dc4078f9cc.tar.gz
gcc-73fe55d7522864d20026dc8d427026dc4078f9cc.tar.bz2
re PR go/89199 (libgo regression in implementation of CompareAndSwap functions resulting in intermittent testcase failures on ppc64le power9 after r268458)
PR go/89199 sync/atomic: use strong form of atomic_compare_exchange_n In the recent change to use atomic_compare_exchange_n I thought we could use the weak form, which can spuriously fail. But that is not how it is implemented in the gc library, and it is not what the rest of the library expects. Thanks to Lynn Boger for identifying the problem. Fixes https://gcc.gnu.org/PR89199 Reviewed-on: https://go-review.googlesource.com/c/161359 From-SVN: r268591
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/sync/atomic/atomic.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/libgo/go/sync/atomic/atomic.c b/libgo/go/sync/atomic/atomic.c
index 25e439d..90a4ff3 100644
--- a/libgo/go/sync/atomic/atomic.c
+++ b/libgo/go/sync/atomic/atomic.c
@@ -69,7 +69,7 @@ _Bool CompareAndSwapInt32 (int32_t *, int32_t, int32_t)
_Bool
CompareAndSwapInt32 (int32_t *val, int32_t old, int32_t new)
{
- return __atomic_compare_exchange_n (val, &old, new, true, __ATOMIC_SEQ_CST,
+ return __atomic_compare_exchange_n (val, &old, new, false, __ATOMIC_SEQ_CST,
__ATOMIC_RELAXED);
}
@@ -82,7 +82,7 @@ CompareAndSwapInt64 (int64_t *val, int64_t old, int64_t new)
{
if (((uintptr_t) val & 7) != 0)
val = NULL;
- return __atomic_compare_exchange_n (val, &old, new, true, __ATOMIC_SEQ_CST,
+ return __atomic_compare_exchange_n (val, &old, new, false, __ATOMIC_SEQ_CST,
__ATOMIC_RELAXED);
}
@@ -93,7 +93,7 @@ _Bool CompareAndSwapUint32 (uint32_t *, uint32_t, uint32_t)
_Bool
CompareAndSwapUint32 (uint32_t *val, uint32_t old, uint32_t new)
{
- return __atomic_compare_exchange_n (val, &old, new, true, __ATOMIC_SEQ_CST,
+ return __atomic_compare_exchange_n (val, &old, new, false, __ATOMIC_SEQ_CST,
__ATOMIC_RELAXED);
}
@@ -106,7 +106,7 @@ CompareAndSwapUint64 (uint64_t *val, uint64_t old, uint64_t new)
{
if (((uintptr_t) val & 7) != 0)
val = NULL;
- return __atomic_compare_exchange_n (val, &old, new, true, __ATOMIC_SEQ_CST,
+ return __atomic_compare_exchange_n (val, &old, new, false, __ATOMIC_SEQ_CST,
__ATOMIC_RELAXED);
}
@@ -117,7 +117,7 @@ _Bool CompareAndSwapUintptr (uintptr_t *, uintptr_t, uintptr_t)
_Bool
CompareAndSwapUintptr (uintptr_t *val, uintptr_t old, uintptr_t new)
{
- return __atomic_compare_exchange_n (val, &old, new, true, __ATOMIC_SEQ_CST,
+ return __atomic_compare_exchange_n (val, &old, new, false, __ATOMIC_SEQ_CST,
__ATOMIC_RELAXED);
}