diff options
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | include/asterisk/lock.h | 24 |
2 files changed, 28 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index 7da4da62e..f27ec1d55 100644 --- a/configure.ac +++ b/configure.ac @@ -887,6 +887,11 @@ AC_DEFINE([HAVE_GCC_ATOMICS], 1, [Define to 1 if your GCC C compiler provides at AC_MSG_RESULT(no) ) +AC_CHECK_HEADER([libkern/OSAtomic.h], + [AC_DEFINE_UNQUOTED([HAVE_OSX_ATOMICS], 1, [Define to 1 if OSX atomic operations are supported.])]) + +AC_CHECK_SIZEOF(int) + AC_CONFIG_FILES([build_tools/menuselect-deps makeopts]) AC_OUTPUT diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h index f60e04e1a..b6c850569 100644 --- a/include/asterisk/lock.h +++ b/include/asterisk/lock.h @@ -738,6 +738,10 @@ int ast_atomic_fetchadd_int_slow(volatile int *p, int v); #include "asterisk/inline_api.h" +#ifdef __Darwin__ +#include "libkern/OSAtomic.h" +#endif + /*! \brief Atomically add v to *p and return * the previous value of *p. * This can be used to handle reference counts, and the return value * can be used to generate unique identifiers. @@ -748,7 +752,16 @@ AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), { return __sync_fetch_and_add(p, v); }) -#elif defined ( __i386__) +#elif defined(HAVE_OSX_ATOMICS) && (SIZEOF_INT == 4) +AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), +{ + return OSAtomicAdd32(v, (int32_t *) p); +}) +#elif defined(HAVE_OSX_ATOMICS) && (SIZEOF_INT == 8) +AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), +{ + return OSAtomicAdd64(v, (int64_t *) p); +#elif defined (__i386__) AST_INLINE_API(int ast_atomic_fetchadd_int(volatile int *p, int v), { __asm __volatile ( @@ -773,6 +786,15 @@ AST_INLINE_API(int ast_atomic_dec_and_test(volatile int *p), { return __sync_sub_and_fetch(p, 1) == 0; }) +#elif defined(HAVE_OSX_ATOMICS) && (SIZEOF_INT == 4) +AST_INLINE_API(int ast_atomic_dec_and_test(volatile int *p), +{ + return OSAtomicDecrement32((int32_t *) p) == 0; +}) +#elif defined(HAVE_OSX_ATOMICS) && (SIZEOF_INT == 8) +AST_INLINE_API(int ast_atomic_dec_and_test(volatile int *p), +{ + return OSAtomicDecrement64((int64_t *) p) == 0; #else AST_INLINE_API(int ast_atomic_dec_and_test(volatile int *p), { |