| Patch to fix build errors when using libc++ as libc++ |
| does not provide the header <ext/atomicity.h>. |
| This is a backport from upstream OpenCV where the issue is |
| already fixed. |
| |
| diff -Nuar old/OpenCV-2.3.0/modules/core/include/opencv2/core/operations.hpp new/OpenCV-2.3.0/modules/core/include/opencv2/core/operations.hpp |
| --- old/OpenCV-2.3.0/modules/core/include/opencv2/core/operations.hpp |
| +++ new/OpenCV-2.3.0/modules/core/include/opencv2/core/operations.hpp |
| @@ -51,35 +51,28 @@ |
| #ifdef __cplusplus |
| |
| /////// exchange-add operation for atomic operations on reference counters /////// |
| -#ifdef __GNUC__ |
| - |
| - #if __GNUC__*10 + __GNUC_MINOR__ >= 42 |
| - |
| - #if !defined WIN32 && (defined __i486__ || defined __i586__ || \ |
| - defined __i686__ || defined __MMX__ || defined __SSE__ || defined __ppc__) |
| - #define CV_XADD __sync_fetch_and_add |
| - #else |
| - #include <ext/atomicity.h> |
| - #define CV_XADD __gnu_cxx::__exchange_and_add |
| - #endif |
| - |
| - #else |
| - #include <bits/atomicity.h> |
| - #if __GNUC__*10 + __GNUC_MINOR__ >= 34 |
| - #define CV_XADD __gnu_cxx::__exchange_and_add |
| - #else |
| - #define CV_XADD __exchange_and_add |
| - #endif |
| - #endif |
| - |
| -#elif defined WIN32 || defined _WIN32 |
| - #include <intrin.h> |
| - #define CV_XADD(addr,delta) _InterlockedExchangeAdd((long volatile*)(addr), (delta)) |
| +#ifdef CV_XADD |
| + // allow to use user-defined macro |
| +#elif defined __GNUC__ || defined __clang__ |
| +# if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__) |
| +# ifdef __ATOMIC_ACQ_REL |
| +# define CV_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), delta, __ATOMIC_ACQ_REL) |
| +# else |
| +# define CV_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), delta, 4) |
| +# endif |
| +# else |
| +# if defined __ATOMIC_ACQ_REL && !defined __clang__ |
| + // version for gcc >= 4.7 |
| +# define CV_XADD(addr, delta) (int)__atomic_fetch_add((unsigned*)(addr), (unsigned)(delta), __ATOMIC_ACQ_REL) |
| +# else |
| +# define CV_XADD(addr, delta) (int)__sync_fetch_and_add((unsigned*)(addr), (unsigned)(delta)) |
| +# endif |
| +# endif |
| +#elif defined _MSC_VER && !defined RC_INVOKED |
| +# include <intrin.h> |
| +# define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd((long volatile*)addr, delta) |
| #else |
| - |
| - template<typename _Tp> static inline _Tp CV_XADD(_Tp* addr, _Tp delta) |
| - { int tmp = *addr; *addr += delta; return tmp; } |
| - |
| + CV_INLINE CV_XADD(int* addr, int delta) { int tmp = *addr; *addr += delta; return tmp; } |
| #endif |
| |
| #include <limits> |