1 # sets HAVE_ATOMICS, checks for :
2 # - C++11 std::atomic: HAVE_CXX_STDATOMIC
3 # - C11 stdatomic: HAVE_C_STDATOMIC
4 # - builtin __atomic: HAVE_BUILTIN_ATOMIC
5 # - builtin __sync: HAVE_BUILTIN_SYNC
6 # - atomic_add_nv: HAVE_ATOMIC_ADD_NV
8 configure_define(HAVE_ATOMICS)
13 std::atomic<int> i(0);
14 return atomic_load(&i);
19 #include <stdatomic.h>
23 return atomic_load(&i);
28 configure_define(HAVE_BUILTIN_ATOMIC)
29 configure_define_literal(BUILTIN_ATOMIC_PREFIX)
30 foreach(BUILTIN_ATOMIC_PREFIX IN ITEMS __c11 _ "")
34 return ${BUILTIN_ATOMIC_PREFIX}_atomic_add_fetch(&l,1,__ATOMIC_RELAXED);
36 HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
37 if (HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
38 set(HAVE_BUILTIN_ATOMIC 1)
46 return __sync_add_and_fetch(&l,1);
53 volatile uint_t i = 0;
54 return atomic_add_int_nv(&i, 1) == 1 ? 0 : -1;
59 if ( (HAVE_CXX_STDATOMIC)
61 OR (HAVE_BUILTIN_ATOMIC)
62 OR (HAVE_BUILTIN_SYNC)
63 OR (HAVE_ATOMIC_ADD_NV))
64 set(HAVE_ATOMICS 1 CACHE INTERNAL "HAVE_ATOMICS")