|
From: <sv...@op...> - 2026-10-23 12:37:46
|
Author: manx Date: Fri Oct 23 14:37:37 2026 New Revision: 25781 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25781 Log: Merged revision(s) 25769, 25771 from trunk/OpenMPT: [Imp] mpt/base/utility.hpp: Add mpt::observable_checkpoint(), like C++26 std::observable_checkpoint(). [Imp] mpt/base/utility.hpp: Add mpt::compiler_barrier(std::memory_order), mpt::cpu_barrier(std::memory_order), mpt::full_barrier(). ........ [Var] Run clang-format. ........ Modified: branches/OpenMPT-1.32/ (props changed) branches/OpenMPT-1.32/src/mpt/base/utility.hpp Modified: branches/OpenMPT-1.32/src/mpt/base/utility.hpp ============================================================================== --- branches/OpenMPT-1.32/src/mpt/base/utility.hpp Fri Oct 23 14:32:00 2026 (r25780) +++ branches/OpenMPT-1.32/src/mpt/base/utility.hpp Fri Oct 23 14:37:37 2026 (r25781) @@ -13,6 +13,9 @@ #include "mpt/base/saturate_round.hpp" #endif +#if MPT_CXX_BEFORE(26) +#include <atomic> +#endif #if MPT_CXX_BEFORE(23) && !MPT_COMPILER_MSVC && !MPT_COMPILER_GCC && !MPT_COMPILER_CLANG #include <exception> #endif @@ -257,6 +260,70 @@ +#if MPT_CXX_AT_LEAST(26) + +using std::observable_checkpoint; + +#else // !C++26 + +#if MPT_COMPILER_MSVC +inline void observable_checkpoint() { + _ReadWriteBarrier(); +} +#elif MPT_COMPILER_GCC || MPT_COMPILER_CLANG +inline void observable_checkpoint() { + // clang-format off + __asm__ __volatile__("" ::: "memory"); + // clang-format on +} +#else +inline void observable_checkpoint() { + std::atomic_signal_fence(std::memory_order_release); +} +#endif + +#endif // C++26 + + + +inline void compiler_barrier(std::memory_order order) { +#if MPT_COMPILER_CLANG + // clang-format off + __asm__ __volatile__("" ::: "memory"); + // clang-format on +#endif + std::atomic_signal_fence(order); +#if MPT_COMPILER_CLANG + // clang-format off + __asm__ __volatile__("" ::: "memory"); + // clang-format on +#endif +} + + + +inline void cpu_barrier(std::memory_order order) { + std::atomic_thread_fence(order); +} + + + +inline void full_barrier() { +#if MPT_COMPILER_CLANG + // clang-format off + __asm__ __volatile__("" ::: "memory"); + // clang-format on + std::atomic_thread_fence(std::memory_order_seq_cst); + // clang-format off + __asm__ __volatile__("" ::: "memory"); + // clang-format on +#else + std::atomic_thread_fence(std::memory_order_seq_cst); +#endif +} + + + } // namespace MPT_INLINE_NS } // namespace mpt |