Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
013fd9bf
Commit
013fd9bf
authored
Mar 12, 2013
by
Andrey Kamaev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Make CV_XADD independent on STL and system headers
parent
9f3ce0dd
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
22 additions
and
39 deletions
+22
-39
operations.hpp
modules/core/include/opencv2/core/operations.hpp
+22
-28
system.cpp
modules/core/src/system.cpp
+0
-11
No files found.
modules/core/include/opencv2/core/operations.hpp
View file @
013fd9bf
...
...
@@ -52,45 +52,39 @@
#ifdef __cplusplus
/////// exchange-add operation for atomic operations on reference counters ///////
#if defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32) // atomic increment on the linux version of the Intel(tm) compiler
#define CV_XADD(addr,delta) _InterlockedExchangeAdd(const_cast<void*>(reinterpret_cast<volatile void*>(addr)), delta)
#if defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32)
// atomic increment on the linux version of the Intel(tm) compiler
#define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd(const_cast<void*>(reinterpret_cast<volatile void*>(addr)), delta)
#elif defined __GNUC__
#if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__
#ifdef __ATOMIC_SEQ_CST
#define CV_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), (delta), __ATOMIC_SEQ_CST)
#else
#define CV_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), (delta), 5)
#endif
#elif __GNUC__*10 + __GNUC_MINOR__ >= 42
#if !(defined WIN32 || defined _WIN32) && (defined __i486__ || defined __i586__ || \
defined __i686__ || defined __MMX__ || defined __SSE__ || defined __ppc__) || \
(defined __GNUC__ && defined _STLPORT_MAJOR)
#define CV_XADD __sync_fetch_and_add
#ifdef __ATOMIC_ACQ_REL
#define CV_XADD(addr, delta) __c11_atomic_fetch_add((_Atomic(int)*)(addr), delta, __ATOMIC_ACQ_REL)
#else
#include <ext/atomicity.h>
#define CV_XADD __gnu_cxx::__exchange_and_add
#define CV_XADD(addr, delta) __atomic_fetch_add((_Atomic(int)*)(addr), delta, 4)
#endif
#else
#i
nclude <bits/atomicity.h>
#if __GNUC__*10 + __GNUC_MINOR__ >= 34
#define CV_XADD __gnu_cxx::__exchange_and_add
#i
fdef __ATOMIC_ACQ_REL
// version for gcc >= 4.7
#define CV_XADD(addr, delta) __atomic_fetch_add(addr, delta, __ATOMIC_ACQ_REL)
#else
#define CV_XADD __exchange_and_add
#define CV_XADD(addr, delta) __sync_fetch_and_add(addr, delta)
#endif
#endif
#elif defined WIN32 || defined _WIN32 || defined WINCE
namespace
cv
{
CV_EXPORTS
int
_interlockedExchangeAdd
(
int
*
addr
,
int
delta
);
}
#define CV_XADD cv::_interlockedExchangeAdd
#elif (defined WIN32 || defined _WIN32 || defined WINCE) && (!defined RC_INVOKED)
#if !defined(_M_AMD64) && !defined(_M_IA64) && !defined(_M_ARM)
extern
"C"
__declspec
(
dllimport
)
long
__stdcall
InterlockedExchangeAdd
(
long
volatile
*
Addend
,
long
Value
);
#define CV_XADD(addr, delta) (int)InterlockedExchangeAdd((long volatile*)addr, delta)
#else
extern
"C"
long
_InterlockedExchangeAdd
(
long
volatile
*
Addend
,
long
Value
);
#pragma intrinsic(_InterlockedExchangeAdd)
#define CV_XADD(addr, delta) (int)_InterlockedExchangeAdd((long volatile*)addr, delta)
#endif
#else
static
inline
int
CV_XADD
(
int
*
addr
,
int
delta
)
{
int
tmp
=
*
addr
;
*
addr
+=
delta
;
return
tmp
;
}
static
inline
CV_XADD
(
int
*
addr
,
int
delta
)
{
int
tmp
=
*
addr
;
*
addr
+=
delta
;
return
tmp
;
}
#endif
#include <limits>
#ifdef _MSC_VER
...
...
modules/core/src/system.cpp
View file @
013fd9bf
...
...
@@ -811,17 +811,6 @@ struct Mutex::Impl
int
refcount
;
};
#ifndef __GNUC__
int
_interlockedExchangeAdd
(
int
*
addr
,
int
delta
)
{
#if defined _MSC_VER && _MSC_VER >= 1500
return
(
int
)
_InterlockedExchangeAdd
((
long
volatile
*
)
addr
,
delta
);
#else
return
(
int
)
InterlockedExchangeAdd
((
long
volatile
*
)
addr
,
delta
);
#endif
}
#endif // __GNUC__
#elif defined __APPLE__
#include <libkern/OSAtomic.h>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment