From 0480ca48fbddc79f41c16e8ef8e251e095b1a6f3 Mon Sep 17 00:00:00 2001 From: aldelaro5 Date: Sat, 20 Aug 2016 23:57:39 -0400 Subject: [PATCH] Add a thread safe variant of clearing the jit cache --- Source/Core/Core/PowerPC/JitCommon/JitCache.cpp | 14 ++++++++++++++ Source/Core/Core/PowerPC/JitCommon/JitCache.h | 1 + 2 files changed, 15 insertions(+) diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp index 6f345b9636..0817bdc7de 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp +++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.cpp @@ -17,6 +17,7 @@ #include "Common/JitRegister.h" #include "Core/ConfigManager.h" #include "Core/Core.h" +#include "Core/CoreTiming.h" #include "Core/PowerPC/JitCommon/JitBase.h" #include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/PowerPC.h" @@ -27,6 +28,13 @@ using namespace Gen; +static int s_clear_jit_cache_thread_safe; + +static void ClearCacheThreadSafe(u64 userdata, s64 cyclesdata) +{ + JitInterface::ClearCache(); +} + bool JitBaseBlockCache::IsFull() const { return GetNumBlocks() >= MAX_NUM_BLOCKS - 1; @@ -34,6 +42,7 @@ bool JitBaseBlockCache::IsFull() const void JitBaseBlockCache::Init() { + s_clear_jit_cache_thread_safe = CoreTiming::RegisterEvent("clearJitCache", ClearCacheThreadSafe); JitRegister::Init(SConfig::GetInstance().m_perfDir); iCache.fill(0); @@ -73,6 +82,11 @@ void JitBaseBlockCache::Clear() blocks[0].invalid = true; } +void JitBaseBlockCache::SchedulateClearCacheThreadSafe() +{ + CoreTiming::ScheduleEvent(0, s_clear_jit_cache_thread_safe); +} + void JitBaseBlockCache::Reset() { Shutdown(); diff --git a/Source/Core/Core/PowerPC/JitCommon/JitCache.h b/Source/Core/Core/PowerPC/JitCommon/JitCache.h index 842e723ee9..f3a3c8b4a3 100644 --- a/Source/Core/Core/PowerPC/JitCommon/JitCache.h +++ b/Source/Core/Core/PowerPC/JitCommon/JitCache.h @@ -159,6 +159,7 @@ public: void FinalizeBlock(int block_num, bool block_link, const u8* code_ptr); void Clear(); + void SchedulateClearCacheThreadSafe(); void Init(); void Shutdown(); void Reset();