blob: 0f6e309926393dc7b82e2a5f39ff52aa4072e41e [file] [log] [blame]
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>