> +#define rte_bit_atomic_test(addr, nr, memory_order) \ > + _Generic((addr), \ > + uint32_t *: __rte_bit_atomic_test32, \ > + uint64_t *: __rte_bit_atomic_test64)(addr, nr, memory_order)
I wonder if these should have RTE_ATOMIC qualifier: + RTE_ATOMIC(uint32_t) *: __rte_bit_atomic_test32, \ + RTE_ATOMIC(uint64_t) *: __rte_bit_atomic_test64)(addr, nr, memory_order) > +#define __RTE_GEN_BIT_ATOMIC_TEST(size) > \ > + static inline bool \ > + __rte_bit_atomic_test ## size(const uint ## size ## _t *addr, \ I wonder if the "addr" parameter should have RTE_ATOMIC qualifier: + __rte_bit_atomic_test ## size(const RTE_ATOMIC(uint ## size ## _t) *addr, \ instead of casting into a_addr. > + unsigned int nr, int memory_order) \ > + { \ > + RTE_ASSERT(nr < size); \ > + \ > + const RTE_ATOMIC(uint ## size ## _t) *a_addr = \ > + (const RTE_ATOMIC(uint ## size ## _t) *)addr; \ > + uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \ > + return rte_atomic_load_explicit(a_addr, memory_order) & mask; \ > + } Similar considerations regarding volatile qualifier for the "once" operations.