X-Git-Url: https://git.m6w6.name/?p=m6w6%2Flibmemcached;a=blobdiff_plain;f=CMake%2FCheckAtomics.cmake;h=73060fee0175f29eaf83e830b543dd0a17b42775;hp=e09c8fd3287b412f890b9f00e068f41526a78cef;hb=01c5e0ed8d3d9c72ea192792d1c49a50e756d635;hpb=808f81dba2553a1e552e8f3cea3ee376ad7d3558 diff --git a/CMake/CheckAtomics.cmake b/CMake/CheckAtomics.cmake index e09c8fd3..73060fee 100644 --- a/CMake/CheckAtomics.cmake +++ b/CMake/CheckAtomics.cmake @@ -1,58 +1,65 @@ -include(CheckCSourceRuns) -include(CheckCXXSourceRuns) - # sets HAVE_ATOMICS, checks for : # - C++11 std::atomic: HAVE_CXX_STDATOMIC # - C11 stdatomic: HAVE_C_STDATOMIC # - builtin __atomic: HAVE_BUILTIN_ATOMIC # - builtin __sync: HAVE_BUILTIN_SYNC # - atomic_add_nv: HAVE_ATOMIC_ADD_NV -function(check_atomics) - check_cxx_source_runs(" - #include - int main() { - std::atomic i(0); - return atomic_load(&i); - }" - HAVE_CXX_STDATOMIC) - check_c_source_runs(" - #include - int main() { - atomic_int i; - atomic_init(&i, 0); - return atomic_load(&i); - }" - HAVE_C_STDATOMIC) - foreach(BUILTIN_ATOMIC_PREFIX IN ITEMS _ __c11) - check_c_source_runs(" - int main() { - long l = -1; - return ${BUILTIN_ATOMIC_PREFIX}_atomic_add_fetch(&l,1,__ATOMIC_RELAXED); - }" - HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX}) - if (HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX}) - set(HAVE_BUILTIN_ATOMIC 1) - break() - endif() - endforeach() - check_c_source_runs(" + +configure_define(HAVE_ATOMICS) + +check_cxx_source(" + #include + int main() { + std::atomic i(0); + return atomic_load(&i); + }" + HAVE_CXX_STDATOMIC) + +check_c_source(" + #include + int main() { + atomic_int i; + atomic_init(&i, 0); + return atomic_load(&i); + }" + HAVE_C_STDATOMIC) + + +configure_define(HAVE_BUILTIN_ATOMIC) +configure_define_literal(BUILTIN_ATOMIC_PREFIX) +foreach(BUILTIN_ATOMIC_PREFIX IN ITEMS __c11 _ "") + check_c_source(" int main() { long l = -1; - return __sync_add_and_fetch(&l,1); - }" - HAVE_BUILTIN_SYNC) - check_c_source_runs(" - #include - int main() { - volatile uint_t i = 0; - return atomic_add_int_nv(&i, 1) == 1 ? 0 : -1; + return ${BUILTIN_ATOMIC_PREFIX}_atomic_add_fetch(&l,1,__ATOMIC_RELAXED); }" - HAVE_ATOMIC_ADD_NV) - if ( HAVE_CXX_STDATOMIC - OR HAVE_C_STDATOMIC - OR HAVE_BUILTIN_ATOMIC - OR HAVE_BUILTIN_SYNC - OR HAVE_ATOMIC_ADD_NV) - set(HAVE_ATOMICS 1 PARENT_SCOPE) + HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX}) + if (HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX}) + set(HAVE_BUILTIN_ATOMIC 1) + break() endif() -endfunction() +endforeach() + +check_c_source(" + int main() { + long l = -1; + return __sync_add_and_fetch(&l,1); + }" + HAVE_BUILTIN_SYNC) + +check_c_source(" + #include + int main() { + volatile uint_t i = 0; + return atomic_add_int_nv(&i, 1) == 1 ? 0 : -1; + }" + HAVE_ATOMIC_ADD_NV) + + +if ( (HAVE_CXX_STDATOMIC) + OR (HAVE_C_STDATOMIC) + OR (HAVE_BUILTIN_ATOMIC) + OR (HAVE_BUILTIN_SYNC) + OR (HAVE_ATOMIC_ADD_NV)) + set(HAVE_ATOMICS 1 CACHE INTERNAL "HAVE_ATOMICS") +endif()