Atomics.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #pragma once
  4. JPH_SUPPRESS_WARNINGS_STD_BEGIN
  5. #include <atomic>
  6. JPH_SUPPRESS_WARNINGS_STD_END
  7. JPH_NAMESPACE_BEGIN
  8. // Things we're using from STL
  9. using std::atomic;
  10. using std::memory_order;
  11. using std::memory_order_relaxed;
  12. using std::memory_order_acquire;
  13. using std::memory_order_release;
  14. using std::memory_order_seq_cst;
  15. /// Atomically compute the min(ioAtomic, inValue) and store it in ioAtomic, returns true if value was updated
  16. template <class T>
  17. bool AtomicMin(atomic<T> &ioAtomic, const T inValue, const memory_order inMemoryOrder = memory_order_seq_cst)
  18. {
  19. T cur_value = ioAtomic.load(memory_order_relaxed);
  20. while (cur_value > inValue)
  21. if (ioAtomic.compare_exchange_weak(cur_value, inValue, inMemoryOrder))
  22. return true;
  23. return false;
  24. }
  25. /// Atomically compute the max(ioAtomic, inValue) and store it in ioAtomic, returns true if value was updated
  26. template <class T>
  27. bool AtomicMax(atomic<T> &ioAtomic, const T inValue, const memory_order inMemoryOrder = memory_order_seq_cst)
  28. {
  29. T cur_value = ioAtomic.load(memory_order_relaxed);
  30. while (cur_value < inValue)
  31. if (ioAtomic.compare_exchange_weak(cur_value, inValue, inMemoryOrder))
  32. return true;
  33. return false;
  34. }
  35. JPH_NAMESPACE_END