summaryrefslogtreecommitdiff
path: root/test/support/cmpxchg_loop.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/support/cmpxchg_loop.h')
-rw-r--r--test/support/cmpxchg_loop.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/test/support/cmpxchg_loop.h b/test/support/cmpxchg_loop.h
new file mode 100644
index 0000000000000..c39e3fb12f676
--- /dev/null
+++ b/test/support/cmpxchg_loop.h
@@ -0,0 +1,51 @@
+#include <atomic>
+
+template <class A, class T>
+bool cmpxchg_weak_loop(A& atomic, T& expected, T desired) {
+ for (int i = 0; i < 10; i++) {
+ if (atomic.compare_exchange_weak(expected, desired) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <class A, class T>
+bool cmpxchg_weak_loop(A& atomic, T& expected, T desired,
+ std::memory_order success,
+ std::memory_order failure) {
+ for (int i = 0; i < 10; i++) {
+ if (atomic.compare_exchange_weak(expected, desired, success,
+ failure) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <class A, class T>
+bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired) {
+ for (int i = 0; i < 10; i++) {
+ if (std::atomic_compare_exchange_weak(atomic, expected, desired) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+template <class A, class T>
+bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired,
+ std::memory_order success,
+ std::memory_order failure) {
+ for (int i = 0; i < 10; i++) {
+ if (std::atomic_compare_exchange_weak_explicit(atomic, expected, desired,
+ success, failure) == true) {
+ return true;
+ }
+ }
+
+ return false;
+}