commit 62aec002ccd6a7129b4f5e2e88be1957a6b2308b Author: Olivier Houchard Date: Thu Mar 7 18:48:22 2019 +0100 MEDIUM: threads: Use __ATOMIC_SEQ_CST when using the newer atomic API. When using the new __atomic* API, ask the compiler to generate barriers. A variant of those functions that don't generate barriers will be added later. Before that, using HA_ATOMIC* would not generate any barrier, and some parts of the code should be reviewed and missing barriers should be added. This should probably be backported to 1.8 and 1.9. (cherry picked from commit 113537967c8680f94977473e18c9e14dc09c3356) [wt: this is in fact a real bug fix : all these atomics do not provide the slightest sequential consistency by default as the value 0 is __ATOMIC_RELAXED, which will definitely cause random issues with threads on non-x86 platforms]. Signed-off-by: Willy Tarreau (cherry picked from commit e5d1670f5fa95972fed6391201c0da8982bb9f94) Signed-off-by: Christopher Faulet diff --git a/include/common/hathreads.h b/include/common/hathreads.h index 24fb1d1a..8a738aaf 100644 --- a/include/common/hathreads.h +++ b/include/common/hathreads.h @@ -213,14 +213,14 @@ static inline unsigned long thread_isolated() }) #else /* gcc >= 4.7 */ -#define HA_ATOMIC_CAS(val, old, new) __atomic_compare_exchange_n(val, old, new, 0, 0, 0) -#define HA_ATOMIC_ADD(val, i) __atomic_add_fetch(val, i, 0) -#define HA_ATOMIC_XADD(val, i) __atomic_fetch_add(val, i, 0) -#define HA_ATOMIC_SUB(val, i) __atomic_sub_fetch(val, i, 0) -#define HA_ATOMIC_AND(val, flags) __atomic_and_fetch(val, flags, 0) -#define HA_ATOMIC_OR(val, flags) __atomic_or_fetch(val, flags, 0) -#define HA_ATOMIC_XCHG(val, new) __atomic_exchange_n(val, new, 0) -#define HA_ATOMIC_STORE(val, new) __atomic_store_n(val, new, 0) +#define HA_ATOMIC_CAS(val, old, new) __atomic_compare_exchange_n(val, old, new, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_ADD(val, i) __atomic_add_fetch(val, i, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_XADD(val, i) __atomic_fetch_add(val, i, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_SUB(val, i) __atomic_sub_fetch(val, i, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_AND(val, flags) __atomic_and_fetch(val, flags, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_OR(val, flags) __atomic_or_fetch(val, flags, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_XCHG(val, new) __atomic_exchange_n(val, new, __ATOMIC_SEQ_CST) +#define HA_ATOMIC_STORE(val, new) __atomic_store_n(val, new, __ATOMIC_SEQ_CST) #endif #define HA_ATOMIC_UPDATE_MAX(val, new) \