more cleanup
[m6w6/libmemcached] / CMake / CheckAtomics.cmake
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
7
8 configure_define(HAVE_ATOMICS)
9
10 check_cxx_source("
11 #include <atomic>
12 int main() {
13 std::atomic<int> i(0);
14 return atomic_load(&i);
15 }"
16 HAVE_CXX_STDATOMIC)
17
18 check_c_source("
19 #include <stdatomic.h>
20 int main() {
21 atomic_int i;
22 atomic_init(&i, 0);
23 return atomic_load(&i);
24 }"
25 HAVE_C_STDATOMIC)
26
27
28 configure_define(HAVE_BUILTIN_ATOMIC)
29 configure_define_literal(BUILTIN_ATOMIC_PREFIX)
30 foreach(BUILTIN_ATOMIC_PREFIX IN ITEMS __c11 _ "")
31 check_c_source("
32 int main() {
33 long l = -1;
34 return ${BUILTIN_ATOMIC_PREFIX}_atomic_add_fetch(&l,1,__ATOMIC_RELAXED);
35 }"
36 HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
37 if (HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
38 set(HAVE_BUILTIN_ATOMIC 1)
39 break()
40 endif()
41 endforeach()
42
43 check_c_source("
44 int main() {
45 long l = -1;
46 return __sync_add_and_fetch(&l,1);
47 }"
48 HAVE_BUILTIN_SYNC)
49
50 check_c_source("
51 #include <atomic.h>
52 int main() {
53 volatile uint_t i = 0;
54 return atomic_add_int_nv(&i, 1) == 1 ? 0 : -1;
55 }"
56 HAVE_ATOMIC_ADD_NV)
57
58
59 if ( (HAVE_CXX_STDATOMIC)
60 OR (HAVE_C_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")
65 endif()