diff --git a/kotlin-native/runtime/src/main/cpp/Mutex.hpp b/kotlin-native/runtime/src/main/cpp/Mutex.hpp index ea3bc2571ca..c9ade714f26 100644 --- a/kotlin-native/runtime/src/main/cpp/Mutex.hpp +++ b/kotlin-native/runtime/src/main/cpp/Mutex.hpp @@ -36,20 +36,23 @@ class SpinLock; template <> class SpinLock : private Pinned { public: - // No need to check for external calls, because we explicitly ignore thread state. - NO_EXTERNAL_CALLS_CHECK void lock() noexcept { + void lock() noexcept { while(flag_.test_and_set(std::memory_order_acquire)) { - std::this_thread::yield(); + yield(); } } - // No need to check for external calls, because we explicitly ignore thread state. - NO_EXTERNAL_CALLS_CHECK void unlock() noexcept { + void unlock() noexcept { flag_.clear(std::memory_order_release); } private: std::atomic_flag flag_ = ATOMIC_FLAG_INIT; + + // No need to check for external calls, because we explicitly ignore thread state. + static NO_EXTERNAL_CALLS_CHECK NO_INLINE void yield() { + std::this_thread::yield(); + } }; template <>