- [for user-defined linker section support],
- [ovs_cv_use_linker_sections],
- [OVS_LINK2_IFELSE(
- [AC_LANG_SOURCE(
- [int a __attribute__((__section__("mysection"))) = 1;
- int b __attribute__((__section__("mysection"))) = 2;
- int c __attribute__((__section__("mysection"))) = 3;])],
- [AC_LANG_PROGRAM(
- [#include <stdio.h>
- extern int __start_mysection;
- extern int __stop_mysection;],
- [int n_ints = &__stop_mysection - &__start_mysection;
- int *i;
- for (i = &__start_mysection; i < &__start_mysection + n_ints; i++) {
- printf("%d\n", *i);
- }])],
- [ovs_cv_use_linker_sections=yes],
- [ovs_cv_use_linker_sections=no])])
- if test $ovs_cv_use_linker_sections = yes; then
- AC_DEFINE([USE_LINKER_SECTIONS], [1],
- [Define to 1 if the compiler support putting variables
- into sections with user-defined names and the linker
- automatically defines __start_SECNAME and __stop_SECNAME
- symbols that designate the start and end of the section.])
- fi
- AM_CONDITIONAL(
- [USE_LINKER_SECTIONS], [test $ovs_cv_use_linker_sections = yes])])
+ [whether $CC supports GCC 4.0+ atomic built-ins],
+ [ovs_cv_gcc4_atomics],
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#include <stdlib.h>
+
+#define ovs_assert(expr) if (!(expr)) abort();
+#define TEST_ATOMIC_TYPE(TYPE) \
+ { \
+ TYPE x = 1; \
+ TYPE orig; \
+ \
+ __sync_synchronize(); \
+ ovs_assert(x == 1); \
+ \
+ __sync_synchronize(); \
+ x = 3; \
+ __sync_synchronize(); \
+ ovs_assert(x == 3); \
+ \
+ orig = __sync_fetch_and_add(&x, 1); \
+ ovs_assert(orig == 3); \
+ __sync_synchronize(); \
+ ovs_assert(x == 4); \
+ \
+ orig = __sync_fetch_and_sub(&x, 2); \
+ ovs_assert(orig == 4); \
+ __sync_synchronize(); \
+ ovs_assert(x == 2); \
+ \
+ orig = __sync_fetch_and_or(&x, 6); \
+ ovs_assert(orig == 2); \
+ __sync_synchronize(); \
+ ovs_assert(x == 6); \
+ \
+ orig = __sync_fetch_and_and(&x, 10); \
+ ovs_assert(orig == 6); \
+ __sync_synchronize(); \
+ ovs_assert(x == 2); \
+ \
+ orig = __sync_fetch_and_xor(&x, 10); \
+ ovs_assert(orig == 2); \
+ __sync_synchronize(); \
+ ovs_assert(x == 8); \
+ }]], [dnl
+TEST_ATOMIC_TYPE(char);
+TEST_ATOMIC_TYPE(unsigned char);
+TEST_ATOMIC_TYPE(signed char);
+TEST_ATOMIC_TYPE(short);
+TEST_ATOMIC_TYPE(unsigned short);
+TEST_ATOMIC_TYPE(int);
+TEST_ATOMIC_TYPE(unsigned int);
+TEST_ATOMIC_TYPE(long int);
+TEST_ATOMIC_TYPE(unsigned long int);
+TEST_ATOMIC_TYPE(long long int);
+TEST_ATOMIC_TYPE(unsigned long long int);
+])],
+ [ovs_cv_gcc4_atomics=yes],
+ [ovs_cv_gcc4_atomics=no])])
+ if test $ovs_cv_gcc4_atomics = yes; then
+ AC_DEFINE([HAVE_GCC4_ATOMICS], [1],
+ [Define to 1 if the C compiler and linker supports the GCC 4.0+
+ atomic built-ins.])
+ fi])
+
+dnl OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE(SIZE)
+dnl
+dnl Checks __atomic_always_lock_free(SIZE, 0)
+AC_DEFUN([OVS_CHECK_ATOMIC_ALWAYS_LOCK_FREE],
+ [AC_CACHE_CHECK(
+ [value of __atomic_always_lock_free($1)],
+ [ovs_cv_atomic_always_lock_free_$1],
+ [AC_COMPUTE_INT(
+ [ovs_cv_atomic_always_lock_free_$1],
+ [__atomic_always_lock_free($1, 0)],
+ [],
+ [ovs_cv_atomic_always_lock_free_$1=unsupported])])
+ if test ovs_cv_atomic_always_lock_free_$1 != unsupported; then
+ AC_DEFINE_UNQUOTED(
+ [ATOMIC_ALWAYS_LOCK_FREE_$1B],
+ [$ovs_cv_atomic_always_lock_free_$1],
+ [If the C compiler is GCC 4.7 or later, define to the return value of
+ __atomic_always_lock_free($1, 0). If the C compiler is not GCC or is
+ an older version of GCC, the value does not matter.])
+ fi])
+
+dnl OVS_CHECK_POSIX_AIO
+AC_DEFUN([OVS_CHECK_POSIX_AIO],
+ [AC_SEARCH_LIBS([aio_write], [rt])
+ AM_CONDITIONAL([HAVE_POSIX_AIO], [test "$ac_cv_search_aio_write" != no])])
+
+dnl OVS_CHECK_INCLUDE_NEXT
+AC_DEFUN([OVS_CHECK_INCLUDE_NEXT],
+ [AC_REQUIRE([gl_CHECK_NEXT_HEADERS])
+ gl_CHECK_NEXT_HEADERS([$1])])