+UATOMICSRC=urcu/uatomic/$ARCHTYPE.h
+ARCHSRC=urcu/arch/$ARCHTYPE.h
+
+AS_IF([test "x$SUBARCHTYPE" = xx86compat],[
+ AC_DEFINE([CONFIG_RCU_COMPAT_ARCH], [1])
+])
+
+AS_IF([test "$host_cpu" = "armv7l"],[
+ CFLAGS="$CFLAGS -mcpu=cortex-a9 -mtune=cortex-a9 -O1"
+])
+
+# ARM-specific checks
+AS_IF([test "x$ARCHTYPE" = "xarm"],[
+ AC_MSG_CHECKING([for dmb instruction])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+ int main()
+ {
+ asm volatile("dmb":::"memory");
+ return 0;
+ }
+ ]])
+ ],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE([CONFIG_RCU_ARM_HAVE_DMB], [1])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+])
+
+# Tile-specific checks
+AS_IF([echo "$host_cpu" | grep "^tile"],[
+ AC_MSG_CHECKING([for Tile architecture type])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ #ifndef __tilegx__
+ #error
+ #endif
+ ]])
+ ],[
+ AC_MSG_RESULT([ok])
+ ],[
+ AC_MSG_FAILURE([URCU has only been tested on the TileGx architecture. For other Tile* architectures, please run the tests first and report the results to the maintainer so that proper support can be added.])
+ ])
+])
+
+# x86-specific checks
+AS_IF([test "x$ARCHTYPE" = "xx86"],[
+ AC_MSG_CHECKING([if architecture really supports the mfence instruction])
+ #For now, using lock; addl compatibility mode even for i686, because the
+ #Pentium III is seen as a i686, but lacks mfence instruction.
+ #Only using fence for x86_64.
+ AS_IF([test "x$host_cpu" != "xi386" -a "x$host_cpu" != "xi486" -a "x$host_cpu" != "xi586" -a "x$host_cpu" != "xi686"],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE([CONFIG_RCU_HAVE_FENCE], [1])
+ ],[
+ AC_MSG_RESULT([no])
+ ])
+])
+
+# Check if sys_futex() is available
+AC_MSG_CHECKING([for sys_futex()])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+ #include <sys/syscall.h>
+ #ifndef __NR_futex
+ #error "futexes not available"
+ #endif
+ ]])
+],[
+ AC_MSG_RESULT([yes])
+ AC_DEFINE([CONFIG_RCU_HAVE_FUTEX], [1])
+ compat_futex_test=0
+],[
+ AC_MSG_RESULT([no])
+ compat_futex_test=1
+])
+
+AM_CONDITIONAL([COMPAT_FUTEX], [test "x$compat_futex_test" = "x1"])
+AM_CONDITIONAL([COMPAT_ARCH], [test "x$SUBARCHTYPE" = "xx86compat"])
+
+# smp-support configure option
+AC_ARG_ENABLE([smp-support],
+ AS_HELP_STRING([--disable-smp-support], [Disable SMP support. Warning: only use this on uniprocessor systems. [default=enabled]]),
+ [def_smp_support=$enableval],
+ [def_smp_support="yes"])
+AS_IF([test "x$def_smp_support" = "xyes"], [AC_DEFINE([CONFIG_RCU_SMP], [1])])
+
+
+# From the sched_setaffinity(2)'s man page:
+# ~~~~
+# The CPU affinity system calls were introduced in Linux kernel 2.5.8.
+# The library interfaces were introduced in glibc 2.3. Initially, the
+# glibc interfaces included a cpusetsize argument. In glibc 2.3.3,
+# the cpuset size argument was removed, but this argument was
+# restored in glibc 2.3.4.
+# ~~~~
+
+# In addition to that, some vendors ported the system call to 2.4
+# kernels.
+
+# Furthermore, when the function first appeared, the MASK argument was
+# an unsigned long pointer, while later it was made into a cpu_set_t
+# pointer. Systems that have the cpu_set_t version also should have
+# the CPU_ZERO, CPU_SET, etc. macros.
+
+# All this mess means we have to cater for at least 3 different
+# sched_setaffinity prototypes:
+
+# ~~~~
+# int sched_setaffinity (pid_t pid, unsigned int len, unsigned long *mask);
+# int sched_setaffinity (pid_t __pid, size_t __cpusetsize, const cpu_set_t *__cpuset);
+# int sched_setaffinity (pid_t __pid, const cpu_set_t *__mask);
+# ~~~~
+
+# Since we define _GNU_SOURCE in the sources, must do so too in the
+# autoconf tests, as defining _GNU_SOURCE or not exposes
+# sched_setaffinity bits differently.
+saved_CFLAGS=$CFLAGS
+CFLAGS="$CFLAGS -D_GNU_SOURCE"