3DiVi Face SDK  3.24.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Groups
atomic_exchange_add.h
1 #ifndef __FACE_SDK__PBIO__ATOMIC_EXCHANGE_ADD_H__85f16090e1cc420091945dab3a112af4
2 #define __FACE_SDK__PBIO__ATOMIC_EXCHANGE_ADD_H__85f16090e1cc420091945dab3a112af4
3 
4 
6 
7 #if defined __INTEL_COMPILER && !(defined WIN32 || defined _WIN32)
8  // atomic increment on the linux version of the Intel(tm) compiler
9 
10 namespace pbio {
11 static inline int atomic_exchange_add(int &x, const int delta) { return (int)_InterlockedExchangeAdd(const_cast<void*>(reinterpret_cast<volatile void*>(&x)), delta); }
12 } // pbio
13 
14 
15 #elif defined __GNUC__
16 # if defined __clang__ && __clang_major__ >= 3 && !defined __ANDROID__ && !defined __EMSCRIPTEN__ && !defined(__CUDACC__)
17 # ifdef __ATOMIC_ACQ_REL
18 
19 
20 namespace pbio {
21 static inline int atomic_exchange_add(int &x, const int delta) { return __c11_atomic_fetch_add((_Atomic(int)*)(&x), delta, __ATOMIC_ACQ_REL); }
22 } // pbio
23 
24 
25 # else
26 
27 
28 namespace pbio {
29 static inline int atomic_exchange_add(int &x, const int delta) { return __atomic_fetch_add((_Atomic(int)*)(&x), delta, 4); }
30 } // pbio
31 
32 
33 # endif
34 # else
35 # if defined __ATOMIC_ACQ_REL && !defined __clang__
36  // version for gcc >= 4.7
37 
38 
39 namespace pbio {
40 static inline int atomic_exchange_add(int &x, const int delta) { return (int)__atomic_fetch_add((int*)(&x), (int)(delta), __ATOMIC_ACQ_REL); }
41 } // pbio
42 
43 
44 # else
45 
46 
47 namespace pbio {
48 static inline int atomic_exchange_add(int &x, const int delta) { return (int)__sync_fetch_and_add((int*)(&x), (int)(delta)); }
49 } // pbio
50 
51 
52 # endif
53 # endif
54 #elif defined _MSC_VER && !defined RC_INVOKED
55 
56 
57 #include <intrin.h>
58 
59 namespace pbio {
60 static inline int atomic_exchange_add(int &x, const int delta) { return (int)_InterlockedExchangeAdd((long volatile*)(&x), delta); }
61 } // pbio
62 
63 
64 #else
65 
66 #error no atomic_exchange_add implementation
67 
68 #endif
69 
71 
72 #endif // __FACE_SDK__PBIO__ATOMIC_EXCHANGE_ADD_H__85f16090e1cc420091945dab3a112af4