60 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#include <atomic>10 11template <class A>12bool 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 22template <class A>23bool 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 36template <class A>37bool 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 47template <class A>48bool 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