]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: thread: implement HA_ATOMIC_XADD()
authorWilly Tarreau <w@1wt.eu>
Wed, 5 Sep 2018 14:11:03 +0000 (16:11 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 5 Sep 2018 14:30:17 +0000 (16:30 +0200)
We've been missing it several times and now we'll need it to increment
a request counter. Let's do it once for all.

This patch will need to be backported to 1.8 with the associated fix.

include/common/hathreads.h

index b53cd77e95008cfa2617c3a6dfc88973d3a12e6e..01b218165eecaf504a3215e88cd8ab4cb4c1c88c 100644 (file)
@@ -47,6 +47,13 @@ enum { tid = 0 };
 #define HA_ATOMIC_CAS(val, old, new) ({((*val) == (*old)) ? (*(val) = (new) , 1) : (*(old) = *(val), 0);})
 #define HA_ATOMIC_ADD(val, i)        ({*(val) += (i);})
 #define HA_ATOMIC_SUB(val, i)        ({*(val) -= (i);})
+#define HA_ATOMIC_XADD(val, i)                                         \
+       ({                                                              \
+               typeof((val)) __p_xadd = (val);                         \
+               typeof(*(val)) __old_xadd = *__p_xadd;                  \
+               *__p_xadd += i;                                         \
+               __old_xadd;                                             \
+       })
 #define HA_ATOMIC_AND(val, flags)    ({*(val) &= (flags);})
 #define HA_ATOMIC_OR(val, flags)     ({*(val) |= (flags);})
 #define HA_ATOMIC_XCHG(val, new)                                       \
@@ -169,6 +176,7 @@ static inline unsigned long thread_isolated()
 
 #define HA_ATOMIC_ADD(val, i)        __sync_add_and_fetch(val, i)
 #define HA_ATOMIC_SUB(val, i)        __sync_sub_and_fetch(val, i)
+#define HA_ATOMIC_XADD(val, i)       __sync_fetch_and_add(val, i)
 #define HA_ATOMIC_AND(val, flags)    __sync_and_and_fetch(val, flags)
 #define HA_ATOMIC_OR(val, flags)     __sync_or_and_fetch(val,  flags)
 
@@ -230,6 +238,7 @@ static inline unsigned long thread_isolated()
 /* 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)