diff options
Diffstat (limited to 'test/support/cmpxchg_loop.h')
-rw-r--r-- | test/support/cmpxchg_loop.h | 51 |
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; +} |