From: Amos Jeffries Date: Fri, 13 Mar 2015 11:26:27 +0000 (-0700) Subject: Portability: check 64-bit GNU atomic operators are useable X-Git-Tag: merge-candidate-3-v1~222 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c3530a9d82a173ec159a7691c3399c079eb7062;p=thirdparty%2Fsquid.git Portability: check 64-bit GNU atomic operators are useable Sometimes (namely 32-bit OpenBSD libstdc++) do not fully implement the GNU atomic operators for both 32-bit and 64-bit. But Squid makes use of both types if the compiler deems them required. We need to check them all before declaring the atomics usable, or not. Thanks to Stuart Henderson for identifying the issue. --- diff --git a/configure.ac b/configure.ac index 5b43401b5b..6f1b55de0d 100644 --- a/configure.ac +++ b/configure.ac @@ -424,17 +424,30 @@ dnl Check for atomic operations support in the compiler dnl AC_MSG_CHECKING([for GNU atomic operations support]) AC_RUN_IFELSE([AC_LANG_PROGRAM([[ - int n = 0; + int32_t n_32 = 0; + uint64_t n_64 = 0; ]],[[ - __sync_add_and_fetch(&n, 10); // n becomes 10 - __sync_fetch_and_add(&n, 20); // n becomes 30 - __sync_sub_and_fetch(&n, 15); // n becomes 15 - __sync_bool_compare_and_swap(&n, 15, 201); // n becomes 201 - __sync_fetch_and_and(&n, 200); // n becomes 200 - return (n == 200) ? 0 : -1; + // 32-bit + __sync_add_and_fetch(&n_32, 10); // n becomes 10 + __sync_fetch_and_add(&n_32, 20); // n becomes 30 + __sync_sub_and_fetch(&n_32, 15); // n becomes 15 + __sync_bool_compare_and_swap(&n_32, 15, 201); // n becomes 201 + __sync_fetch_and_and(&n_32, 200); // n becomes 200 + if (n != 200) return -1; + + // 64-bit + __sync_add_and_fetch(&n_64, 10); // n becomes 10 + __sync_fetch_and_add(&n_64, 20); // n becomes 30 + __sync_sub_and_fetch(&n_64, 15); // n becomes 15 + __sync_bool_compare_and_swap(&n_64, 15, 201); // n becomes 201 + __sync_fetch_and_and(&n_64, 200); // n becomes 200 + if (n_64 != 200) return -1; + + // seems to be okay. + return 0; ]])], [ - AC_DEFINE(HAVE_ATOMIC_OPS,1,[Define to 1 if you have __sync_add_and_fetch() and such]) + AC_DEFINE(HAVE_ATOMIC_OPS,1,[Define to 1 if you have GCC __sync_add_and_fetch() and such]) AC_MSG_RESULT(yes) ],[ AC_MSG_RESULT(no)