#define HA_ATOMIC_OR(val, flags) ({*(val) |= (flags);})
#define HA_ATOMIC_XCHG(val, new) \
({ \
- typeof(*(val)) __old = *(val); \
+ typeof(*(val)) __old_xchg = *(val); \
*(val) = new; \
- __old; \
+ __old_xchg; \
})
#define HA_ATOMIC_BTS(val, bit) \
({ \
- typeof((val)) __p = (val); \
- typeof(*__p) __b = (1UL << (bit)); \
- typeof(*__p) __t = *__p & __b; \
- if (!__t) \
- *__p |= __b; \
- __t; \
+ typeof((val)) __p_bts = (val); \
+ typeof(*__p_bts) __b_bts = (1UL << (bit)); \
+ typeof(*__p_bts) __t_bts = *__p_bts & __b_bts; \
+ if (!__t_bts) \
+ *__p_bts |= __b_bts; \
+ __t_bts; \
})
#define HA_ATOMIC_BTR(val, bit) \
({ \
- typeof((val)) __p = (val); \
- typeof(*__p) __b = (1UL << (bit)); \
- typeof(*__p) __t = *__p & __b; \
- if (__t) \
- *__p &= ~__b; \
- __t; \
+ typeof((val)) __p_btr = (val); \
+ typeof(*__p_btr) __b_btr = (1UL << (bit)); \
+ typeof(*__p_btr) __t_btr = *__p_btr & __b_btr; \
+ if (__t_btr) \
+ *__p_btr &= ~__b_btr; \
+ __t_btr; \
})
#define HA_ATOMIC_STORE(val, new) ({*(val) = new;})
#define HA_ATOMIC_UPDATE_MAX(val, new) \
({ \
- typeof(*(val)) __new = (new); \
+ typeof(*(val)) __new_max = (new); \
\
- if (*(val) < __new) \
- *(val) = __new; \
+ if (*(val) < __new_max) \
+ *(val) = __new_max; \
*(val); \
})
#define HA_ATOMIC_UPDATE_MIN(val, new) \
({ \
- typeof(*(val)) __new = (new); \
+ typeof(*(val)) __new_min = (new); \
\
- if (*(val) > __new) \
- *(val) = __new; \
+ if (*(val) > __new_min) \
+ *(val) = __new_min; \
*(val); \
})
* but only if it differs from the expected one. If it's the same it's a race
* thus we try again to avoid confusing a possibly sensitive caller.
*/
-#define HA_ATOMIC_CAS(val, old, new) \
- ({ \
- typeof((val)) __val = (val); \
- typeof((old)) __oldp = (old); \
- typeof(*(old)) __oldv; \
- typeof((new)) __new = (new); \
- int __ret; \
- do { \
- __oldv = *__val; \
- __ret = __sync_bool_compare_and_swap(__val, *__oldp, __new); \
- } while (!__ret && *__oldp == __oldv); \
- if (!__ret) \
- *__oldp = __oldv; \
- __ret; \
+#define HA_ATOMIC_CAS(val, old, new) \
+ ({ \
+ typeof((val)) __val_cas = (val); \
+ typeof((old)) __oldp_cas = (old); \
+ typeof(*(old)) __oldv_cas; \
+ typeof((new)) __new_cas = (new); \
+ int __ret_cas; \
+ do { \
+ __oldv_cas = *__val_cas; \
+ __ret_cas = __sync_bool_compare_and_swap(__val_cas, *__oldp_cas, __new_cas); \
+ } while (!__ret_cas && *__oldp_cas == __oldv_cas); \
+ if (!__ret_cas) \
+ *__oldp_cas = __oldv_cas; \
+ __ret_cas; \
})
-#define HA_ATOMIC_XCHG(val, new) \
- ({ \
- typeof((val)) __val = (val); \
- typeof(*(val)) __old; \
- typeof((new)) __new = (new); \
- do { __old = *__val; \
- } while (!__sync_bool_compare_and_swap(__val, __old, __new)); \
- __old; \
+#define HA_ATOMIC_XCHG(val, new) \
+ ({ \
+ typeof((val)) __val_xchg = (val); \
+ typeof(*(val)) __old_xchg; \
+ typeof((new)) __new_xchg = (new); \
+ do { __old_xchg = *__val_xchg; \
+ } while (!__sync_bool_compare_and_swap(__val_xchg, __old_xchg, __new_xchg)); \
+ __old_xchg; \
})
#define HA_ATOMIC_BTS(val, bit) \
({ \
- typeof(*(val)) __b = (1UL << (bit)); \
- __sync_fetch_and_or((val), __b) & __b; \
+ typeof(*(val)) __b_bts = (1UL << (bit)); \
+ __sync_fetch_and_or((val), __b_bts) & __b_bts; \
})
#define HA_ATOMIC_BTR(val, bit) \
({ \
- typeof(*(val)) __b = (1UL << (bit)); \
- __sync_fetch_and_and((val), ~__b) & __b; \
+ typeof(*(val)) __b_btr = (1UL << (bit)); \
+ __sync_fetch_and_and((val), ~__b_btr) & __b_btr; \
})
-#define HA_ATOMIC_STORE(val, new) \
- ({ \
- typeof((val)) __val = (val); \
- typeof(*(val)) __old; \
- typeof((new)) __new = (new); \
- do { __old = *__val; \
- } while (!__sync_bool_compare_and_swap(__val, __old, __new)); \
+#define HA_ATOMIC_STORE(val, new) \
+ ({ \
+ typeof((val)) __val_store = (val); \
+ typeof(*(val)) __old_store; \
+ typeof((new)) __new_store = (new); \
+ do { __old_store = *__val_store; \
+ } while (!__sync_bool_compare_and_swap(__val_store, __old_store, __new_store)); \
})
#else
/* gcc >= 4.7 */
#define HA_ATOMIC_OR(val, flags) __atomic_or_fetch(val, flags, 0)
#define HA_ATOMIC_BTS(val, bit) \
({ \
- typeof(*(val)) __b = (1UL << (bit)); \
- __sync_fetch_and_or((val), __b) & __b; \
+ typeof(*(val)) __b_bts = (1UL << (bit)); \
+ __sync_fetch_and_or((val), __b_bts) & __b_bts; \
})
#define HA_ATOMIC_BTR(val, bit) \
({ \
- typeof(*(val)) __b = (1UL << (bit)); \
- __sync_fetch_and_and((val), ~__b) & __b; \
+ typeof(*(val)) __b_btr = (1UL << (bit)); \
+ __sync_fetch_and_and((val), ~__b_btr) & __b_btr; \
})
#define HA_ATOMIC_XCHG(val, new) __atomic_exchange_n(val, new, 0)
#define HA_ATOMIC_UPDATE_MAX(val, new) \
({ \
- typeof(*(val)) __old = *(val); \
- typeof(*(val)) __new = (new); \
+ typeof(*(val)) __old_max = *(val); \
+ typeof(*(val)) __new_max = (new); \
\
- while (__old < __new && !HA_ATOMIC_CAS(val, &__old, __new)); \
- (*val); \
+ while (__old_max < __new_max && \
+ !HA_ATOMIC_CAS(val, &__old_max, __new_max)); \
+ *(val); \
})
#define HA_ATOMIC_UPDATE_MIN(val, new) \
({ \
- typeof((*val)) __old = *(val); \
- typeof((*val)) __new = (new); \
+ typeof(*(val)) __old_min = *(val); \
+ typeof(*(val)) __new_min = (new); \
\
- while (__old > __new && !HA_ATOMIC_CAS(val, &__old, __new)); \
- (*val); \
+ while (__old_min > __new_min && \
+ !HA_ATOMIC_CAS(val, &__old_min, __new_min)); \
+ *(val); \
})
#define HA_BARRIER() pl_barrier()