Nugget
atomic_standalone.h
1 // Copyright (c) Electronic Arts Inc. All rights reserved.
4 
5 
6 #ifndef EASTL_ATOMIC_INTERNAL_STANDALONE_H
7 #define EASTL_ATOMIC_INTERNAL_STANDALONE_H
8 
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
10  #pragma once
11 #endif
12 
13 
14 namespace eastl
15 {
16 
17 
19 //
20 // bool atomic_compare_exchange_strong(eastl::atomic<T>*, T* expected, T desired)
21 //
22 template <typename T>
23 EASTL_FORCE_INLINE bool atomic_compare_exchange_strong(eastl::atomic<T>* atomicObj,
24  typename eastl::atomic<T>::value_type* expected,
25  typename eastl::atomic<T>::value_type desired) EA_NOEXCEPT
26 {
27  return atomicObj->compare_exchange_strong(*expected, desired);
28 }
29 
30 template <typename T, typename OrderSuccess, typename OrderFailure>
31 EASTL_FORCE_INLINE bool atomic_compare_exchange_strong_explicit(eastl::atomic<T>* atomicObj,
32  typename eastl::atomic<T>::value_type* expected,
33  typename eastl::atomic<T>::value_type desired,
34  OrderSuccess orderSuccess, OrderFailure orderFailure) EA_NOEXCEPT
35 {
36  return atomicObj->compare_exchange_strong(*expected, desired, orderSuccess, orderFailure);
37 }
38 
39 
41 //
42 // bool atomic_compare_exchange_weak(eastl::atomic<T>*, T* expected, T desired)
43 //
44 template <typename T>
45 EASTL_FORCE_INLINE bool atomic_compare_exchange_weak(eastl::atomic<T>* atomicObj,
46  typename eastl::atomic<T>::value_type* expected,
47  typename eastl::atomic<T>::value_type desired) EA_NOEXCEPT
48 {
49  return atomicObj->compare_exchange_weak(*expected, desired);
50 }
51 
52 template <typename T, typename OrderSuccess, typename OrderFailure>
53 EASTL_FORCE_INLINE bool atomic_compare_exchange_weak_explicit(eastl::atomic<T>* atomicObj,
54  typename eastl::atomic<T>::value_type* expected,
55  typename eastl::atomic<T>::value_type desired,
56  OrderSuccess orderSuccess, OrderFailure orderFailure) EA_NOEXCEPT
57 {
58  return atomicObj->compare_exchange_weak(*expected, desired, orderSuccess, orderFailure);
59 }
60 
61 
63 //
64 // T atomic_fetch_xor(eastl::atomic<T>*, T arg)
65 //
66 template <typename T>
67 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_xor(eastl::atomic<T>* atomicObj,
68  typename eastl::atomic<T>::value_type arg) EA_NOEXCEPT
69 {
70  return atomicObj->fetch_xor(arg);
71 }
72 
73 template <typename T, typename Order>
74 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_xor_explicit(eastl::atomic<T>* atomicObj,
75  typename eastl::atomic<T>::value_type arg,
76  Order order) EA_NOEXCEPT
77 {
78  return atomicObj->fetch_xor(arg, order);
79 }
80 
81 
83 //
84 // T atomic_xor_fetch(eastl::atomic<T>*, T arg)
85 //
86 template <typename T>
87 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_xor_fetch(eastl::atomic<T>* atomicObj,
88  typename eastl::atomic<T>::value_type arg) EA_NOEXCEPT
89 {
90  return atomicObj->xor_fetch(arg);
91 }
92 
93 template <typename T, typename Order>
94 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_xor_fetch_explicit(eastl::atomic<T>* atomicObj,
95  typename eastl::atomic<T>::value_type arg,
96  Order order) EA_NOEXCEPT
97 {
98  return atomicObj->xor_fetch(arg, order);
99 }
100 
101 
103 //
104 // T atomic_fetch_or(eastl::atomic<T>*, T arg)
105 //
106 template <typename T>
107 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_or(eastl::atomic<T>* atomicObj,
108  typename eastl::atomic<T>::value_type arg) EA_NOEXCEPT
109 {
110  return atomicObj->fetch_or(arg);
111 }
112 
113 template <typename T, typename Order>
114 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_or_explicit(eastl::atomic<T>* atomicObj,
115  typename eastl::atomic<T>::value_type arg,
116  Order order) EA_NOEXCEPT
117 {
118  return atomicObj->fetch_or(arg, order);
119 }
120 
121 
123 //
124 // T atomic_or_fetch(eastl::atomic<T>*, T arg)
125 //
126 template <typename T>
127 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_or_fetch(eastl::atomic<T>* atomicObj,
128  typename eastl::atomic<T>::value_type arg) EA_NOEXCEPT
129 {
130  return atomicObj->or_fetch(arg);
131 }
132 
133 template <typename T, typename Order>
134 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_or_fetch_explicit(eastl::atomic<T>* atomicObj,
135  typename eastl::atomic<T>::value_type arg,
136  Order order) EA_NOEXCEPT
137 {
138  return atomicObj->or_fetch(arg, order);
139 }
140 
141 
143 //
144 // T atomic_fetch_and(eastl::atomic<T>*, T arg)
145 //
146 template <typename T>
147 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_and(eastl::atomic<T>* atomicObj,
148  typename eastl::atomic<T>::value_type arg) EA_NOEXCEPT
149 {
150  return atomicObj->fetch_and(arg);
151 }
152 
153 template <typename T, typename Order>
154 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_and_explicit(eastl::atomic<T>* atomicObj,
155  typename eastl::atomic<T>::value_type arg,
156  Order order) EA_NOEXCEPT
157 {
158  return atomicObj->fetch_and(arg, order);
159 }
160 
161 
163 //
164 // T atomic_and_fetch(eastl::atomic<T>*, T arg)
165 //
166 template <typename T>
167 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_and_fetch(eastl::atomic<T>* atomicObj,
168  typename eastl::atomic<T>::value_type arg) EA_NOEXCEPT
169 {
170  return atomicObj->and_fetch(arg);
171 }
172 
173 template <typename T, typename Order>
174 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_and_fetch_explicit(eastl::atomic<T>* atomicObj,
175  typename eastl::atomic<T>::value_type arg,
176  Order order) EA_NOEXCEPT
177 {
178  return atomicObj->and_fetch(arg, order);
179 }
180 
181 
183 //
184 // T atomic_fetch_sub(eastl::atomic<T>*, T arg)
185 //
186 template <typename T>
187 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_sub(eastl::atomic<T>* atomicObj,
188  typename eastl::atomic<T>::difference_type arg) EA_NOEXCEPT
189 {
190  return atomicObj->fetch_sub(arg);
191 }
192 
193 template <typename T, typename Order>
194 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_sub_explicit(eastl::atomic<T>* atomicObj,
196  Order order) EA_NOEXCEPT
197 {
198  return atomicObj->fetch_sub(arg, order);
199 }
200 
201 
203 //
204 // T atomic_sub_fetch(eastl::atomic<T>*, T arg)
205 //
206 template <typename T>
207 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_sub_fetch(eastl::atomic<T>* atomicObj,
208  typename eastl::atomic<T>::difference_type arg) EA_NOEXCEPT
209 {
210  return atomicObj->sub_fetch(arg);
211 }
212 
213 template <typename T, typename Order>
214 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_sub_fetch_explicit(eastl::atomic<T>* atomicObj,
216  Order order) EA_NOEXCEPT
217 {
218  return atomicObj->sub_fetch(arg, order);
219 }
220 
221 
223 //
224 // T atomic_fetch_add(eastl::atomic<T>*, T arg)
225 //
226 template <typename T>
227 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_add(eastl::atomic<T>* atomicObj,
228  typename eastl::atomic<T>::difference_type arg) EA_NOEXCEPT
229 {
230  return atomicObj->fetch_add(arg);
231 }
232 
233 template <typename T, typename Order>
234 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_fetch_add_explicit(eastl::atomic<T>* atomicObj,
236  Order order) EA_NOEXCEPT
237 {
238  return atomicObj->fetch_add(arg, order);
239 }
240 
241 
243 //
244 // T atomic_add_fetch(eastl::atomic<T>*, T arg)
245 //
246 template <typename T>
247 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_add_fetch(eastl::atomic<T>* atomicObj,
248  typename eastl::atomic<T>::difference_type arg) EA_NOEXCEPT
249 {
250  return atomicObj->add_fetch(arg);
251 }
252 
253 template <typename T, typename Order>
254 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_add_fetch_explicit(eastl::atomic<T>* atomicObj,
256  Order order) EA_NOEXCEPT
257 {
258  return atomicObj->add_fetch(arg, order);
259 }
260 
261 
263 //
264 // T atomic_exchange(eastl::atomic<T>*, T desired)
265 //
266 template <typename T>
267 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_exchange(eastl::atomic<T>* atomicObj,
268  typename eastl::atomic<T>::value_type desired) EA_NOEXCEPT
269 {
270  return atomicObj->exchange(desired);
271 }
272 
273 template <typename T, typename Order>
274 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_exchange_explicit(eastl::atomic<T>* atomicObj,
275  typename eastl::atomic<T>::value_type desired,
276  Order order) EA_NOEXCEPT
277 {
278  return atomicObj->exchange(desired, order);
279 }
280 
281 
283 //
284 // T atomic_load(const eastl::atomic<T>*)
285 //
286 template <typename T>
287 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_load(const eastl::atomic<T>* atomicObj) EA_NOEXCEPT
288 {
289  return atomicObj->load();
290 }
291 
292 template <typename T, typename Order>
293 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_load_explicit(const eastl::atomic<T>* atomicObj, Order order) EA_NOEXCEPT
294 {
295  return atomicObj->load(order);
296 }
297 
298 
300 //
301 // T atomic_load_cond(const eastl::atomic<T>*)
302 //
303 template <typename T, typename Predicate>
304 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_load_cond(const eastl::atomic<T>* atomicObj, Predicate pred) EA_NOEXCEPT
305 {
306  for (;;)
307  {
308  typename eastl::atomic<T>::value_type ret = atomicObj->load();
309 
310  if (pred(ret))
311  {
312  return ret;
313  }
314 
315  EASTL_ATOMIC_CPU_PAUSE();
316  }
317 }
318 
319 template <typename T, typename Predicate, typename Order>
320 EASTL_FORCE_INLINE typename eastl::atomic<T>::value_type atomic_load_cond_explicit(const eastl::atomic<T>* atomicObj, Predicate pred, Order order) EA_NOEXCEPT
321 {
322  for (;;)
323  {
324  typename eastl::atomic<T>::value_type ret = atomicObj->load(order);
325 
326  if (pred(ret))
327  {
328  return ret;
329  }
330 
331  EASTL_ATOMIC_CPU_PAUSE();
332  }
333 }
334 
335 
337 //
338 // void atomic_store(eastl::atomic<T>*, T)
339 //
340 template <typename T>
341 EASTL_FORCE_INLINE void atomic_store(eastl::atomic<T>* atomicObj, typename eastl::atomic<T>::value_type desired) EA_NOEXCEPT
342 {
343  atomicObj->store(desired);
344 }
345 
346 template <typename T, typename Order>
347 EASTL_FORCE_INLINE void atomic_store_explicit(eastl::atomic<T>* atomicObj, typename eastl::atomic<T>::value_type desired, Order order) EA_NOEXCEPT
348 {
349  atomicObj->store(desired, order);
350 }
351 
352 
354 //
355 // void eastl::atomic_thread_fence(Order)
356 //
357 template <typename Order>
358 EASTL_FORCE_INLINE void atomic_thread_fence(Order) EA_NOEXCEPT
359 {
360  EASTL_ATOMIC_STATIC_ASSERT_INVALID_MEMORY_ORDER(Order);
361 }
362 
363 EASTL_FORCE_INLINE void atomic_thread_fence(eastl::internal::memory_order_relaxed_s) EA_NOEXCEPT
364 {
365  EASTL_ATOMIC_THREAD_FENCE_RELAXED();
366 }
367 
368 EASTL_FORCE_INLINE void atomic_thread_fence(eastl::internal::memory_order_acquire_s) EA_NOEXCEPT
369 {
370  EASTL_ATOMIC_THREAD_FENCE_ACQUIRE();
371 }
372 
373 EASTL_FORCE_INLINE void atomic_thread_fence(eastl::internal::memory_order_release_s) EA_NOEXCEPT
374 {
375  EASTL_ATOMIC_THREAD_FENCE_RELEASE();
376 }
377 
378 EASTL_FORCE_INLINE void atomic_thread_fence(eastl::internal::memory_order_acq_rel_s) EA_NOEXCEPT
379 {
380  EASTL_ATOMIC_THREAD_FENCE_ACQ_REL();
381 }
382 
383 EASTL_FORCE_INLINE void atomic_thread_fence(eastl::internal::memory_order_seq_cst_s) EA_NOEXCEPT
384 {
385  EASTL_ATOMIC_THREAD_FENCE_SEQ_CST();
386 }
387 
388 
390 //
391 // void eastl::atomic_signal_fence(Order)
392 //
393 template <typename Order>
394 EASTL_FORCE_INLINE void atomic_signal_fence(Order) EA_NOEXCEPT
395 {
396  EASTL_ATOMIC_STATIC_ASSERT_INVALID_MEMORY_ORDER(Order);
397 }
398 
399 EASTL_FORCE_INLINE void atomic_signal_fence(eastl::internal::memory_order_relaxed_s) EA_NOEXCEPT
400 {
401  EASTL_ATOMIC_SIGNAL_FENCE_RELAXED();
402 }
403 
404 EASTL_FORCE_INLINE void atomic_signal_fence(eastl::internal::memory_order_acquire_s) EA_NOEXCEPT
405 {
406  EASTL_ATOMIC_SIGNAL_FENCE_ACQUIRE();
407 }
408 
409 EASTL_FORCE_INLINE void atomic_signal_fence(eastl::internal::memory_order_release_s) EA_NOEXCEPT
410 {
411  EASTL_ATOMIC_SIGNAL_FENCE_RELEASE();
412 }
413 
414 EASTL_FORCE_INLINE void atomic_signal_fence(eastl::internal::memory_order_acq_rel_s) EA_NOEXCEPT
415 {
416  EASTL_ATOMIC_SIGNAL_FENCE_ACQ_REL();
417 }
418 
419 EASTL_FORCE_INLINE void atomic_signal_fence(eastl::internal::memory_order_seq_cst_s) EA_NOEXCEPT
420 {
421  EASTL_ATOMIC_SIGNAL_FENCE_SEQ_CST();
422 }
423 
424 
426 //
427 // void eastl::compiler_barrier()
428 //
429 EASTL_FORCE_INLINE void compiler_barrier() EA_NOEXCEPT
430 {
431  EASTL_ATOMIC_COMPILER_BARRIER();
432 }
433 
434 
436 //
437 // void eastl::compiler_barrier_data_dependency(const T&)
438 //
439 template <typename T>
440 EASTL_FORCE_INLINE void compiler_barrier_data_dependency(const T& val) EA_NOEXCEPT
441 {
442  EASTL_ATOMIC_COMPILER_BARRIER_DATA_DEPENDENCY(val, T);
443 }
444 
445 
447 //
448 // void eastl::cpu_pause()
449 //
450 EASTL_FORCE_INLINE void cpu_pause() EA_NOEXCEPT
451 {
452  EASTL_ATOMIC_CPU_PAUSE();
453 }
454 
455 
457 //
458 // bool eastl::atomic_is_lock_free(eastl::atomic<T>*)
459 //
460 template <typename T>
461 EASTL_FORCE_INLINE bool atomic_is_lock_free(const eastl::atomic<T>* atomicObj) EA_NOEXCEPT
462 {
463  return atomicObj->is_lock_free();
464 }
465 
466 
467 } // namespace eastl
468 
469 
470 #endif /* EASTL_ATOMIC_INTERNAL_STANDALONE_H */
EA Standard Template Library.
Definition: algorithm.h:288
Definition: atomic.h:217
Definition: atomic_memory_order.h:26
Definition: atomic_memory_order.h:24
Definition: atomic_memory_order.h:22
Definition: atomic_memory_order.h:25
Definition: atomic_memory_order.h:27