1#include <atomic>
2
3template <class A, class T>
4bool cmpxchg_weak_loop(A& atomic, T& expected, T desired) {
5  for (int i = 0; i < 10; i++) {
6    if (atomic.compare_exchange_weak(expected, desired) == true) {
7      return true;
8    }
9  }
10
11  return false;
12}
13
14template <class A, class T>
15bool cmpxchg_weak_loop(A& atomic, T& expected, T desired,
16                       std::memory_order success,
17                       std::memory_order failure) {
18  for (int i = 0; i < 10; i++) {
19    if (atomic.compare_exchange_weak(expected, desired, success,
20                                     failure) == true) {
21      return true;
22    }
23  }
24
25  return false;
26}
27
28template <class A, class T>
29bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired) {
30  for (int i = 0; i < 10; i++) {
31    if (std::atomic_compare_exchange_weak(atomic, expected, desired) == true) {
32      return true;
33    }
34  }
35
36  return false;
37}
38
39template <class A, class T>
40bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired,
41                         std::memory_order success,
42                         std::memory_order failure) {
43  for (int i = 0; i < 10; i++) {
44    if (std::atomic_compare_exchange_weak_explicit(atomic, expected, desired,
45                                                   success, failure) == true) {
46      return true;
47    }
48  }
49
50  return false;
51}
52