AJA NTV2 SDK  17.0.1.1246
NTV2 SDK 17.0.1.1246
atomic.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
10 #include "ajabase/system/atomic.h"
11 
12 
13 void* AJAAtomic::Exchange(void* volatile* pTarget, void* pValue)
14 {
15  // exchange pointer value with target
16 #if defined(AJA_WINDOWS)
17  #pragma warning(push)
18  #pragma warning(disable: 4311)
19  #pragma warning(disable: 4312)
20  return (void*)InterlockedExchangePointer((void* volatile*)pTarget, (void*)pValue);
21  #pragma warning(pop)
22 #endif
23 
24 #if defined(AJA_LINUX) || defined(AJA_MAC)
25  return __sync_lock_test_and_set(pTarget, pValue);
26 #endif
27 }
28 
29 
30 int32_t AJAAtomic::Exchange(int32_t volatile* pTarget, int32_t value)
31 {
32  // exchange integer value with target
33 #if defined(AJA_WINDOWS)
34  return (int32_t)InterlockedExchange((LONG volatile*)pTarget, (LONG)value);
35 #endif
36 
37 #if defined(AJA_LINUX) || defined(AJA_MAC)
38  return __sync_lock_test_and_set(pTarget, value);
39 #endif
40 }
41 
42 
43 uint32_t AJAAtomic::Exchange(uint32_t volatile* pTarget, uint32_t value)
44 {
45  // exchange unsigned integer value with target
46 #if defined(AJA_WINDOWS)
47  return (uint32_t)InterlockedExchange((LONG volatile*)pTarget, (LONG)value);
48 #endif
49 
50 #if defined(AJA_LINUX) || defined(AJA_MAC)
51  return __sync_lock_test_and_set(pTarget, value);
52 #endif
53 }
54 
55 
56 int64_t AJAAtomic::Exchange(int64_t volatile* pTarget, int64_t value)
57 {
58  // exchange integer value with target
59 #if defined(AJA_WINDOWS)
60  return (int64_t)InterlockedExchange64((LONGLONG volatile*)pTarget, (LONGLONG)value);
61 #endif
62 
63 #if defined(AJA_LINUX) || defined(AJA_MAC)
64  return __sync_lock_test_and_set(pTarget, value);
65 #endif
66 }
67 
68 
69 uint64_t AJAAtomic::Exchange(uint64_t volatile* pTarget, uint64_t value)
70 {
71  // exchange unsigned integer value with target
72 #if defined(AJA_WINDOWS)
73  return (uint64_t)InterlockedExchange64((LONGLONG volatile*)pTarget, (LONGLONG)value);
74 #endif
75 
76 #if defined(AJA_LINUX) || defined(AJA_MAC)
77  return __sync_lock_test_and_set(pTarget, value);
78 #endif
79 }
80 
81 
82 int32_t AJAAtomic::Increment(int32_t volatile* pTarget)
83 {
84  // increment target
85 #if defined(AJA_WINDOWS)
86  return (int32_t)InterlockedIncrement((LONG volatile*)pTarget);
87 #endif
88 
89 #if defined(AJA_LINUX) || defined(AJA_MAC)
90  return __sync_add_and_fetch(pTarget, 1);
91 #endif
92 }
93 
94 
95 int32_t AJAAtomic::Decrement(int32_t volatile* pTarget)
96 {
97  // decrement target
98 #if defined(AJA_WINDOWS)
99  return (int32_t)InterlockedDecrement((LONG volatile*)pTarget);
100 #endif
101 
102 #if defined(AJA_LINUX) || defined(AJA_MAC)
103  return __sync_sub_and_fetch(pTarget, 1);
104 #endif
105 }
106 
107 
108 uint32_t AJAAtomic::Increment(uint32_t volatile* pTarget)
109 {
110  // increment target
111 #if defined(AJA_WINDOWS)
112  return (uint32_t)InterlockedIncrement((LONG volatile*)pTarget);
113 #endif
114 
115 #if defined(AJA_LINUX) || defined(AJA_MAC)
116  return __sync_add_and_fetch(pTarget, 1);
117 #endif
118 }
119 
120 
121 uint32_t AJAAtomic::Decrement(uint32_t volatile* pTarget)
122 {
123  // decrement target
124 #if defined(AJA_WINDOWS)
125  return (uint32_t)InterlockedDecrement((LONG volatile*)pTarget);
126 #endif
127 
128 #if defined(AJA_LINUX) || defined(AJA_MAC)
129  return __sync_sub_and_fetch(pTarget, 1);
130 #endif
131 }
132 
133 
134 int64_t AJAAtomic::Increment(int64_t volatile* pTarget)
135 {
136  // increment target
137 #if defined(AJA_WINDOWS)
138  return (int64_t)InterlockedIncrement64((LONGLONG volatile*)pTarget);
139 #endif
140 
141 #if defined(AJA_LINUX) || defined(AJA_MAC)
142  return __sync_add_and_fetch(pTarget, 1);
143 #endif
144 }
145 
146 
147 int64_t AJAAtomic::Decrement(int64_t volatile* pTarget)
148 {
149  // decrement target
150 #if defined(AJA_WINDOWS)
151  return (int64_t)InterlockedDecrement64((LONGLONG volatile*)pTarget);
152 #endif
153 
154 #if defined(AJA_LINUX) || defined(AJA_MAC)
155  return __sync_sub_and_fetch(pTarget, 1);
156 #endif
157 }
158 
159 
160 uint64_t AJAAtomic::Increment(uint64_t volatile* pTarget)
161 {
162  // increment target
163 #if defined(AJA_WINDOWS)
164  return (uint64_t)InterlockedIncrement64((LONGLONG volatile*)pTarget);
165 #endif
166 
167 #if defined(AJA_LINUX) || defined(AJA_MAC)
168  return __sync_add_and_fetch(pTarget, 1);
169 #endif
170 }
171 
172 
173 uint64_t AJAAtomic::Decrement(uint64_t volatile* pTarget)
174 {
175  // decrement target
176 #if defined(AJA_WINDOWS)
177  return (uint64_t)InterlockedDecrement64((LONGLONG volatile*)pTarget);
178 #endif
179 
180 #if defined(AJA_LINUX) || defined(AJA_MAC)
181  return __sync_sub_and_fetch(pTarget, 1);
182 #endif
183 }
AJAAtomic::Exchange
static void * Exchange(void *volatile *pTarget, void *pValue)
Definition: atomic.cpp:13
system.h
System specific functions.
AJAAtomic::Increment
static int32_t Increment(int32_t volatile *pTarget)
Definition: atomic.cpp:82
common.h
Private include file for all ajabase sources.
atomic.h
Declares the AJAAtomic class.
AJAAtomic::Decrement
static int32_t Decrement(int32_t volatile *pTarget)
Definition: atomic.cpp:95