diff --git a/FEXCore/Source/Interface/Context/Context.h b/FEXCore/Source/Interface/Context/Context.h index fd6fe5b554..e195f6b9e8 100644 --- a/FEXCore/Source/Interface/Context/Context.h +++ b/FEXCore/Source/Interface/Context/Context.h @@ -209,7 +209,7 @@ class ContextImpl final : public FEXCore::Context::Context, public CPU::CodeBuff void ClearCodeCache(FEXCore::Core::InternalThreadState* Thread, bool NewCodeBuffer = true) override; void InvalidateCodeBuffersCodeRange(uint64_t Start, uint64_t Length) override; void InvalidateThreadCachedCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) override; - FEXCore::ForkableSharedMutex& GetCodeInvalidationMutex() override { + FEXCore::Utils::WritePriorityMutex::Mutex& GetCodeInvalidationMutex() override { return CodeInvalidationMutex; } @@ -263,7 +263,7 @@ class ContextImpl final : public FEXCore::Context::Context, public CPU::CodeBuff FEX_CONFIG_OPT(MonoHacks, MONOHACKS); } Config; - FEXCore::ForkableSharedMutex CodeInvalidationMutex; + FEXCore::Utils::WritePriorityMutex::Mutex CodeInvalidationMutex {}; uint32_t StrictSplitLockMutex {}; diff --git a/FEXCore/Source/Interface/Core/CodeCache.cpp b/FEXCore/Source/Interface/Core/CodeCache.cpp index 91b4059d5c..efc6ca5ccc 100644 --- a/FEXCore/Source/Interface/Core/CodeCache.cpp +++ b/FEXCore/Source/Interface/Core/CodeCache.cpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -#include "Utils/SpinWaitLock.h" +#include #include #include diff --git a/FEXCore/Source/Interface/Core/Core.cpp b/FEXCore/Source/Interface/Core/Core.cpp index 25c342771a..7184827004 100644 --- a/FEXCore/Source/Interface/Core/Core.cpp +++ b/FEXCore/Source/Interface/Core/Core.cpp @@ -30,7 +30,7 @@ desc: Glues Frontend, OpDispatcher and IR Opts & Compilation, LookupCache, Dispa #include "Interface/IR/RegisterAllocationData.h" #include "Utils/Allocator.h" #include "Utils/Allocator/HostAllocator.h" -#include "Utils/SpinWaitLock.h" +#include #include "Utils/variable_length_integer.h" #include diff --git a/FEXCore/Source/Interface/Core/LookupCache.h b/FEXCore/Source/Interface/Core/LookupCache.h index ab73cb1c35..bf958d80be 100644 --- a/FEXCore/Source/Interface/Core/LookupCache.h +++ b/FEXCore/Source/Interface/Core/LookupCache.h @@ -3,7 +3,7 @@ #include "Interface/Context/Context.h" #include #include -#include "Utils/WritePriorityMutex.h" +#include #include #include diff --git a/FEXCore/Source/Utils/ArchHelpers/Arm64.cpp b/FEXCore/Source/Utils/ArchHelpers/Arm64.cpp index 4d3c7978f0..24ffeed28e 100644 --- a/FEXCore/Source/Utils/ArchHelpers/Arm64.cpp +++ b/FEXCore/Source/Utils/ArchHelpers/Arm64.cpp @@ -2,7 +2,7 @@ #include "Interface/Core/CPUBackend.h" #include "Interface/Context/Context.h" -#include "Utils/SpinWaitLock.h" +#include #include #include diff --git a/FEXCore/Source/Utils/SpinWaitLock.cpp b/FEXCore/Source/Utils/SpinWaitLock.cpp index 89e9920ace..3dba2d5647 100644 --- a/FEXCore/Source/Utils/SpinWaitLock.cpp +++ b/FEXCore/Source/Utils/SpinWaitLock.cpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -#include "Utils/SpinWaitLock.h" +#include namespace FEXCore::Utils::SpinWaitLock { #ifdef ARCHITECTURE_arm64 diff --git a/FEXCore/include/FEXCore/Core/Context.h b/FEXCore/include/FEXCore/Core/Context.h index 7b84f15f99..ec61b90bf8 100644 --- a/FEXCore/include/FEXCore/Core/Context.h +++ b/FEXCore/include/FEXCore/Core/Context.h @@ -13,10 +13,10 @@ #include #include #include +#include namespace FEXCore { struct HostFeatures; -class ForkableSharedMutex; class ThunkHandler; } // namespace FEXCore @@ -144,7 +144,7 @@ class Context { FEX_DEFAULT_VISIBILITY virtual void InvalidateCodeBuffersCodeRange(uint64_t Start, uint64_t Length) = 0; FEX_DEFAULT_VISIBILITY virtual void InvalidateThreadCachedCodeRange(FEXCore::Core::InternalThreadState* Thread, uint64_t Start, uint64_t Length) = 0; - FEX_DEFAULT_VISIBILITY virtual FEXCore::ForkableSharedMutex& GetCodeInvalidationMutex() = 0; + FEX_DEFAULT_VISIBILITY virtual FEXCore::Utils::WritePriorityMutex::Mutex& GetCodeInvalidationMutex() = 0; FEX_DEFAULT_VISIBILITY virtual void ConfigureAOTGen(FEXCore::Core::InternalThreadState* Thread, fextl::set* ExternalBranches, uint64_t SectionMaxAddress) = 0; diff --git a/FEXCore/Source/Utils/SpinWaitLock.h b/FEXCore/include/FEXCore/Utils/SpinWaitLock.h similarity index 98% rename from FEXCore/Source/Utils/SpinWaitLock.h rename to FEXCore/include/FEXCore/Utils/SpinWaitLock.h index 910b69d3ac..1fa0c03561 100644 --- a/FEXCore/Source/Utils/SpinWaitLock.h +++ b/FEXCore/include/FEXCore/Utils/SpinWaitLock.h @@ -50,8 +50,9 @@ namespace FEXCore::Utils::SpinWaitLock { #define SPINLOOP_32BIT SPINLOOP_BODY(ldar, w) #define SPINLOOP_64BIT SPINLOOP_BODY(ldar, x) -extern uint64_t CycleCounterFrequency; -extern uint64_t CyclesPerNanosecond; +FEX_DEFAULT_VISIBILITY extern uint64_t CycleCounterFrequency; + +FEX_DEFAULT_VISIBILITY extern uint64_t CyclesPerNanosecond; ///< Get the raw cycle counter which is synchronizing. /// `CNTVCTSS_EL0` also does the same thing, but requires the FEAT_ECV feature. diff --git a/FEXCore/Source/Utils/WritePriorityMutex.h b/FEXCore/include/FEXCore/Utils/WritePriorityMutex.h similarity index 98% rename from FEXCore/Source/Utils/WritePriorityMutex.h rename to FEXCore/include/FEXCore/Utils/WritePriorityMutex.h index a382edf5fe..84742f86a4 100644 --- a/FEXCore/Source/Utils/WritePriorityMutex.h +++ b/FEXCore/include/FEXCore/Utils/WritePriorityMutex.h @@ -9,11 +9,15 @@ #include #else #include +// Don't pull in all WIN32 headers for INFINITE. Causes too many problems. +#ifndef INFINITE +#define INFINITE 0xffffffff +#endif #endif #include -#include "Utils/SpinWaitLock.h" +#include namespace FEXCore::Utils::WritePriorityMutex { diff --git a/FEXCore/unittests/APITests/FutexSpinTest.cpp b/FEXCore/unittests/APITests/FutexSpinTest.cpp index 4413ea8001..65f7276fcc 100644 --- a/FEXCore/unittests/APITests/FutexSpinTest.cpp +++ b/FEXCore/unittests/APITests/FutexSpinTest.cpp @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -#include "Utils/SpinWaitLock.h" +#include #include #include #include diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsSMCTracking.cpp b/Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsSMCTracking.cpp index e8987c7e16..d6773a8a0c 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsSMCTracking.cpp +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/SyscallsSMCTracking.cpp @@ -295,7 +295,7 @@ void* SyscallHandler::GuestMmap(bool Is64Bit, FEXCore::Core::InternalThreadState InvalidateCodeRangeIfNecessary(Thread, Result, Size); if (LateMetadata) { - auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), Thread); + auto CodeInvalidationlk = FEXCore::GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), Thread); CTX->AddForceTSOInformation(LateMetadata->VolatileValidRanges, std::move(LateMetadata->VolatileInstructions)); } @@ -335,7 +335,7 @@ uint64_t SyscallHandler::GuestMunmap(bool Is64Bit, FEXCore::Core::InternalThread InvalidateCodeRangeIfNecessary(Thread, reinterpret_cast(addr), Size); if (length) { - auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), Thread); + auto CodeInvalidationlk = FEXCore::GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), Thread); CTX->RemoveForceTSOInformation(reinterpret_cast(addr), length); } diff --git a/Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.h b/Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.h index 2b51c61300..71b5d798f9 100644 --- a/Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.h +++ b/Source/Tools/LinuxEmulation/LinuxSyscalls/ThreadManager.h @@ -221,7 +221,7 @@ class ThreadManager final { // Potential deferred since Thread might not be valid. // Thread object isn't valid very early in frontend's initialization. // To be more optimal the frontend should provide this code with a valid Thread object earlier. - auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), CallingThread); + auto CodeInvalidationlk = FEXCore::GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), CallingThread); CTX->InvalidateCodeBuffersCodeRange(Start, Length); for (auto& Thread : Threads) { CTX->InvalidateThreadCachedCodeRange(Thread->Thread, Start, Length); @@ -235,7 +235,7 @@ class ThreadManager final { // Potential deferred since Thread might not be valid. // Thread object isn't valid very early in frontend's initialization. // To be more optimal the frontend should provide this code with a valid Thread object earlier. - auto CodeInvalidationlk = GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), CallingThread); + auto CodeInvalidationlk = FEXCore::GuardSignalDeferringSectionWithFallback(CTX->GetCodeInvalidationMutex(), CallingThread); CTX->InvalidateCodeBuffersCodeRange(Start, Length); for (auto& Thread : Threads) { CTX->InvalidateThreadCachedCodeRange(Thread->Thread, Start, Length);