From d5c2b473a831ca9e2a93bda30dc131b4fee7314f Mon Sep 17 00:00:00 2001 From: Merry Date: Sun, 7 May 2023 15:12:05 +0100 Subject: [PATCH] spin_lock: Use std::call_once --- src/dynarmic/common/spin_lock_arm64.cpp | 14 +++++--------- src/dynarmic/common/spin_lock_x64.cpp | 14 +++++--------- 2 files changed, 10 insertions(+), 18 deletions(-) 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); }