From 4bb1483c999fa00052137293229c926aa66e64bf Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 28 Jan 2022 08:52:57 +0100 Subject: [PATCH] BUILD: atomic: make the old HA_ATOMIC_LOAD() support const pointers We have an implementation of atomic ops for older versions of gcc that do not provide the __builtin_* API (< 4.4). Recent changes to the pools broke that in pool_releasable() by having a load from a const pointer, which doesn't work there due to a temporary local variable that is declared then assigned. Let's make use of a compount statement to assign it a value when declaring it. There's no need to backport this. (cherry picked from commit 8da23393a1ec3f24dcd408f4b35fdd3d9a141a5f) [wt: 2.5 on gcc-4.4 is reportedly affected by this as well, e.g. in freq_ctr_total()] Signed-off-by: Willy Tarreau --- include/haproxy/atomic.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/include/haproxy/atomic.h b/include/haproxy/atomic.h index af0b10a..f60be95 100644 --- a/include/haproxy/atomic.h +++ b/include/haproxy/atomic.h @@ -194,13 +194,12 @@ #if defined(__GNUC__) && (__GNUC__ < 4 || __GNUC__ == 4 && __GNUC_MINOR__ < 7) && !defined(__clang__) /* gcc < 4.7 */ -#define HA_ATOMIC_LOAD(val) \ - ({ \ - typeof(*(val)) ret; \ - __sync_synchronize(); \ - ret = *(volatile typeof(val))val; \ - __sync_synchronize(); \ - ret; \ +#define HA_ATOMIC_LOAD(val) \ + ({ \ + typeof(*(val)) ret = \ + ({ __sync_synchronize(); *(volatile typeof(val))val; }); \ + __sync_synchronize(); \ + ret; \ }) #define HA_ATOMIC_STORE(val, new) \ -- 1.7.10.4