Merge pull request #12620 from mitaclaw/jit-interface-cpu-thread-guard

JitInterface::ClearCache: Modernize With CPUThreadGuard
This commit is contained in:
Admiral H. Curtiss 2024-03-22 04:17:33 +01:00 committed by GitHub
commit f814dc58b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 52 additions and 53 deletions

View File

@ -408,12 +408,12 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling
jboolean enable)
{
HostThreadLock guard;
Core::SetState(Core::State::Paused);
auto& jit_interface = Core::System::GetInstance().GetJitInterface();
jit_interface.ClearCache();
auto& system = Core::System::GetInstance();
auto& jit_interface = system.GetJitInterface();
const Core::CPUThreadGuard cpu_guard(system);
jit_interface.ClearCache(cpu_guard);
jit_interface.SetProfilingState(enable ? JitInterface::ProfilingState::Enabled :
JitInterface::ProfilingState::Disabled);
Core::SetState(Core::State::Running);
}
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfileResults(JNIEnv*,

View File

@ -1006,7 +1006,7 @@ void UpdateWantDeterminism(Core::System& system, bool initial)
{
NOTICE_LOG_FMT(COMMON, "Want determinism <- {}", new_want_determinism ? "true" : "false");
RunAsCPUThread([&] {
const Core::CPUThreadGuard guard(system);
s_wants_determinism = new_want_determinism;
const auto ios = system.GetIOS();
if (ios)
@ -1016,8 +1016,7 @@ void UpdateWantDeterminism(Core::System& system, bool initial)
// We need to clear the cache because some parts of the JIT depend on want_determinism,
// e.g. use of FMA.
system.GetJitInterface().ClearCache();
});
system.GetJitInterface().ClearCache(guard);
}
}

View File

@ -271,7 +271,8 @@ void MemChecks::AddFromStrings(const TMemChecksStr& mc_strings)
void MemChecks::Add(TMemCheck memory_check)
{
bool had_any = HasAny();
Core::RunAsCPUThread([&] {
const Core::CPUThreadGuard guard(m_system);
// Check for existing breakpoint, and overwrite with new info.
// This is assuming we usually want the new breakpoint over an old one.
const u32 address = memory_check.start_address;
@ -292,9 +293,8 @@ void MemChecks::Add(TMemCheck memory_check)
// If this is the first one, clear the JIT cache so it can switch to
// watchpoint-compatible code.
if (!had_any)
m_system.GetJitInterface().ClearCache();
m_system.GetJitInterface().ClearCache(guard);
m_system.GetMMU().DBATUpdated();
});
}
bool MemChecks::ToggleBreakPoint(u32 address)
@ -318,21 +318,19 @@ void MemChecks::Remove(u32 address)
if (iter == m_mem_checks.cend())
return;
Core::RunAsCPUThread([&] {
const Core::CPUThreadGuard guard(m_system);
m_mem_checks.erase(iter);
if (!HasAny())
m_system.GetJitInterface().ClearCache();
m_system.GetJitInterface().ClearCache(guard);
m_system.GetMMU().DBATUpdated();
});
}
void MemChecks::Clear()
{
Core::RunAsCPUThread([&] {
const Core::CPUThreadGuard guard(m_system);
m_mem_checks.clear();
m_system.GetJitInterface().ClearCache();
m_system.GetJitInterface().ClearCache(guard);
m_system.GetMMU().DBATUpdated();
});
}
TMemCheck* MemChecks::GetMemCheck(u32 address, size_t size)

View File

@ -241,7 +241,7 @@ bool JitInterface::HandleStackFault()
return m_jit->HandleStackFault();
}
void JitInterface::ClearCache()
void JitInterface::ClearCache(const Core::CPUThreadGuard&)
{
if (m_jit)
m_jit->ClearCache();

View File

@ -16,8 +16,9 @@ class JitBase;
namespace Core
{
class CPUThreadGuard;
class System;
}
} // namespace Core
namespace PowerPC
{
enum class CPUCore;
@ -72,7 +73,7 @@ public:
bool HandleStackFault();
// Clearing CodeCache
void ClearCache();
void ClearCache(const Core::CPUThreadGuard& guard);
// This clear is "safe" in the sense that it's okay to run from
// inside a JIT'ed block: it clears the instruction cache, but not

View File

@ -1752,7 +1752,8 @@ void MenuBar::PatchHLEFunctions()
void MenuBar::ClearCache()
{
Core::RunAsCPUThread([] { Core::System::GetInstance().GetJitInterface().ClearCache(); });
auto& system = Core::System::GetInstance();
system.GetJitInterface().ClearCache(Core::CPUThreadGuard{system});
}
void MenuBar::LogInstructions()