diff --git a/src/dynarmic/common/spin_lock_arm64.cpp b/src/dynarmic/common/spin_lock_arm64.cpp index 36871449..db58accb 100644 --- a/src/dynarmic/common/spin_lock_arm64.cpp +++ b/src/dynarmic/common/spin_lock_arm64.cpp @@ -3,6 +3,8 @@ * SPDX-License-Identifier: 0BSD */ +#include + #include #include @@ -43,11 +45,11 @@ struct SpinLockImpl { oaknut::CodeBlock mem; oaknut::CodeGenerator code; - bool initialized = false; void (*lock)(volatile int*); void (*unlock)(volatile int*); }; +std::once_flag flag; SpinLockImpl impl; SpinLockImpl::SpinLockImpl() @@ -66,23 +68,17 @@ void SpinLockImpl::Initialize() { code.RET(); mem.protect(); - - initialized = true; } } // namespace void SpinLock::Lock() { - if (!impl.initialized) [[unlikely]] { - impl.Initialize(); - } + std::call_once(flag, &SpinLockImpl::Initialize, impl); impl.lock(&storage); } void SpinLock::Unlock() { - if (!impl.initialized) [[unlikely]] { - impl.Initialize(); - } + std::call_once(flag, &SpinLockImpl::Initialize, impl); impl.unlock(&storage); } diff --git a/src/dynarmic/common/spin_lock_x64.cpp b/src/dynarmic/common/spin_lock_x64.cpp index 9f0daa63..fdea94f4 100644 --- a/src/dynarmic/common/spin_lock_x64.cpp +++ b/src/dynarmic/common/spin_lock_x64.cpp @@ -3,6 +3,8 @@ * SPDX-License-Identifier: 0BSD */ +#include + #include #include "dynarmic/backend/x64/abi.h" @@ -38,11 +40,11 @@ struct SpinLockImpl { Xbyak::CodeGenerator code; - bool initialized = false; void (*lock)(volatile int*); void (*unlock)(volatile int*); }; +std::once_flag flag; SpinLockImpl impl; void SpinLockImpl::Initialize() { @@ -57,23 +59,17 @@ void SpinLockImpl::Initialize() { unlock = code.getCurr(); EmitSpinLockUnlock(code, ABI_PARAM1, code.eax); code.ret(); - - initialized = true; } } // namespace void SpinLock::Lock() { - if (!impl.initialized) [[unlikely]] { - impl.Initialize(); - } + std::call_once(flag, &SpinLockImpl::Initialize, impl); impl.lock(&storage); } void SpinLock::Unlock() { - if (!impl.initialized) [[unlikely]] { - impl.Initialize(); - } + std::call_once(flag, &SpinLockImpl::Initialize, impl); impl.unlock(&storage); }