From a0307b90e502a48cc73ca936bce0792f5566ba64 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 22 Jun 2016 12:32:34 -0400 Subject: [PATCH] Fix: use clock_get_time for caa_get_cycles fallback on MacOSX Use clock_get_time as fallback to read time for caa_get_cycles on MacOSX. It should not matter much in practice, since x86 uses the cycle counter. Signed-off-by: Mathieu Desnoyers --- configure.ac | 7 ++++--- urcu/arch/generic.h | 34 ++++++++++++++++++++++++++++++++++ urcu/config.h.in | 3 +++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index b3096c6..cf9964b 100644 --- a/configure.ac +++ b/configure.ac @@ -25,6 +25,7 @@ AH_TEMPLATE([CONFIG_RCU_HAVE_FUTEX], [Defined when on a system with futex suppor AH_TEMPLATE([CONFIG_RCU_COMPAT_ARCH], [Compatibility mode for i386 which lacks cmpxchg instruction.]) AH_TEMPLATE([CONFIG_RCU_ARM_HAVE_DMB], [Use the dmb instruction if available for use on ARM.]) AH_TEMPLATE([CONFIG_RCU_TLS], [TLS provided by the compiler.]) +AH_TEMPLATE([CONFIG_RCU_HAVE_CLOCK_GETTIME], [clock_gettime() is detected.]) # Allow overriding storage used for TLS variables. AC_ARG_ENABLE([compiler-tls], @@ -221,9 +222,9 @@ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ ]) # Search for clock_gettime -AC_SEARCH_LIBS([clock_gettime], [rt], [], - [AC_MSG_ERROR([Cannot find clock_gettime function.])] -) +AC_SEARCH_LIBS([clock_gettime], [rt], [ + AC_DEFINE([CONFIG_RCU_HAVE_CLOCK_GETTIME], [1]) +], []) # Check for pthread AC_CHECK_LIB([pthread], [pthread_create], diff --git a/urcu/arch/generic.h b/urcu/arch/generic.h index d423595..4b56ed7 100644 --- a/urcu/arch/generic.h +++ b/urcu/arch/generic.h @@ -153,6 +153,8 @@ extern "C" { #ifndef HAS_CAA_GET_CYCLES #define HAS_CAA_GET_CYCLES +#ifdef CONFIG_RCU_HAVE_CLOCK_GETTIME + #include #include @@ -166,6 +168,38 @@ static inline caa_cycles_t caa_get_cycles (void) return -1ULL; return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec; } + +#elif defined(__APPLE__) + +#include +#include +#include +#include +#include + +typedef uint64_t caa_cycles_t; + +static inline caa_cycles_t caa_get_cycles (void) +{ + mach_timespec_t ts = { 0, 0 }; + static clock_serv_t clock_service; + + if (caa_unlikely(!clock_service)) { + if (host_get_clock_service(mach_host_self(), + SYSTEM_CLOCK, &clock_service)) + return -1ULL; + } + if (caa_unlikely(clock_get_time(clock_service, &ts))) + return -1ULL; + return ((uint64_t) ts.tv_sec * 1000000000ULL) + ts.tv_nsec; +} + +#else + +#error caa_get_cycles() not implemented for this platform. + +#endif + #endif /* HAS_CAA_GET_CYCLES */ #ifdef __cplusplus diff --git a/urcu/config.h.in b/urcu/config.h.in index 98ea365..4b856dc 100644 --- a/urcu/config.h.in +++ b/urcu/config.h.in @@ -19,3 +19,6 @@ /* TLS provided by the compiler. */ #undef CONFIG_RCU_TLS + +/* clock_gettime() is detected. */ +#undef CONFIG_RCU_HAVE_CLOCK_GETTIME -- 2.34.1