xref: /llvm-project/libcxx/test/support/cmpxchg_loop.h (revision fc4bff0cd37fa84ee74e6dff7170b643df3ffa42)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include <atomic>
10 
11 template <class A>
cmpxchg_weak_loop(A & atomic,typename A::value_type & expected,typename A::value_type desired)12 bool cmpxchg_weak_loop(A& atomic, typename A::value_type& expected, typename A::value_type desired) {
13   for (int i = 0; i < 10; i++) {
14     if (atomic.compare_exchange_weak(expected, desired) == true) {
15       return true;
16     }
17   }
18 
19   return false;
20 }
21 
22 template <class A>
cmpxchg_weak_loop(A & atomic,typename A::value_type & expected,typename A::value_type desired,std::memory_order success,std::memory_order failure)23 bool cmpxchg_weak_loop(A& atomic, typename A::value_type& expected, typename A::value_type desired,
24                        std::memory_order success,
25                        std::memory_order failure) {
26   for (int i = 0; i < 10; i++) {
27     if (atomic.compare_exchange_weak(expected, desired, success,
28                                      failure) == true) {
29       return true;
30     }
31   }
32 
33   return false;
34 }
35 
36 template <class A>
c_cmpxchg_weak_loop(A * atomic,typename A::value_type * expected,typename A::value_type desired)37 bool c_cmpxchg_weak_loop(A* atomic, typename A::value_type* expected, typename A::value_type desired) {
38   for (int i = 0; i < 10; i++) {
39     if (std::atomic_compare_exchange_weak(atomic, expected, desired) == true) {
40       return true;
41     }
42   }
43 
44   return false;
45 }
46 
47 template <class A>
c_cmpxchg_weak_loop(A * atomic,typename A::value_type * expected,typename A::value_type desired,std::memory_order success,std::memory_order failure)48 bool c_cmpxchg_weak_loop(A* atomic, typename A::value_type* expected, typename A::value_type desired,
49                          std::memory_order success,
50                          std::memory_order failure) {
51   for (int i = 0; i < 10; i++) {
52     if (std::atomic_compare_exchange_weak_explicit(atomic, expected, desired,
53                                                    success, failure) == true) {
54       return true;
55     }
56   }
57 
58   return false;
59 }
60