cmpxchg_loop.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. #include <atomic>
  9. template <class A, class T>
  10. bool cmpxchg_weak_loop(A& atomic, T& expected, T desired) {
  11. for (int i = 0; i < 10; i++) {
  12. if (atomic.compare_exchange_weak(expected, desired) == true) {
  13. return true;
  14. }
  15. }
  16. return false;
  17. }
  18. template <class A, class T>
  19. bool cmpxchg_weak_loop(A& atomic, T& expected, T desired,
  20. std::memory_order success,
  21. std::memory_order failure) {
  22. for (int i = 0; i < 10; i++) {
  23. if (atomic.compare_exchange_weak(expected, desired, success,
  24. failure) == true) {
  25. return true;
  26. }
  27. }
  28. return false;
  29. }
  30. template <class A, class T>
  31. bool c_cmpxchg_weak_loop(A* atomic, T* expected, T desired) {
  32. for (int i = 0; i < 10; i++) {
  33. if (std::atomic_compare_exchange_weak(atomic, expected, desired) == true) {
  34. return true;
  35. }
  36. }
  37. return false;
  38. }
  39. template <class A, class T>
  40. bool 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. return false;
  50. }