From 7ad38057b55339484a814d573b0f1cafcd7e8881 Mon Sep 17 00:00:00 2001 From: Jonathan Li Date: Thu, 18 Aug 2016 00:19:23 +0100 Subject: [PATCH] symbolmap: Use C++11 recursive mutex Newer wxWidgets versions call SetThreadUILanguage() on Windows, which somehow causes our recursive mutex implementation to take ~1ms when recursive locking occurs. So when a game boots up and the debugger is loading the symbol map which can easily have 15000+ symbols, the GUI locks up for 15+ seconds. Switching to C++11 recursive mutexes seems to work around the issue. It should be safe here since there's no direct interaction with the GUI. Note: There is still a 1-2 second GUI lockup when booting a game on Windows (it has existed for quite a while, and is more noticeable with fast boot). It doesn't seem to affect Linux (or maybe it's harder to detect). --- pcsx2/DebugTools/SymbolMap.cpp | 66 +++++++++++++++++----------------- pcsx2/DebugTools/SymbolMap.h | 4 +-- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/pcsx2/DebugTools/SymbolMap.cpp b/pcsx2/DebugTools/SymbolMap.cpp index cf061dd8ef..5ebb6782bf 100644 --- a/pcsx2/DebugTools/SymbolMap.cpp +++ b/pcsx2/DebugTools/SymbolMap.cpp @@ -27,12 +27,12 @@ SymbolMap symbolMap; #define ARRAY_SIZE(x) (sizeof((x))/sizeof(*(x))) void SymbolMap::SortSymbols() { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); AssignFunctionIndices(); } void SymbolMap::Clear() { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); functions.clear(); labels.clear(); data.clear(); @@ -45,7 +45,7 @@ void SymbolMap::Clear() { bool SymbolMap::LoadNocashSym(const char *filename) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); FILE *f = fopen(filename, "r"); if (!f) return false; @@ -103,7 +103,7 @@ bool SymbolMap::LoadNocashSym(const char *filename) { } SymbolType SymbolMap::GetSymbolType(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); if (activeFunctions.find(address) != activeFunctions.end()) return ST_FUNCTION; if (activeData.find(address) != activeData.end()) @@ -156,7 +156,7 @@ bool SymbolMap::GetSymbolInfo(SymbolInfo *info, u32 address, SymbolType symmask) } u32 SymbolMap::GetNextSymbolAddress(u32 address, SymbolType symmask) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); const auto functionEntry = symmask & ST_FUNCTION ? activeFunctions.upper_bound(address) : activeFunctions.end(); const auto dataEntry = symmask & ST_DATA ? activeData.upper_bound(address) : activeData.end(); @@ -173,7 +173,7 @@ u32 SymbolMap::GetNextSymbolAddress(u32 address, SymbolType symmask) { } std::string SymbolMap::GetDescription(unsigned int address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); const char* labelName = NULL; u32 funcStart = GetFunctionStart(address); @@ -197,7 +197,7 @@ std::vector SymbolMap::GetAllSymbols(SymbolType symmask) { std::vector result; if (symmask & ST_FUNCTION) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); for (auto it = activeFunctions.begin(); it != activeFunctions.end(); it++) { SymbolEntry entry; entry.address = it->first; @@ -210,7 +210,7 @@ std::vector SymbolMap::GetAllSymbols(SymbolType symmask) { } if (symmask & ST_DATA) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); for (auto it = activeData.begin(); it != activeData.end(); it++) { SymbolEntry entry; entry.address = it->first; @@ -226,7 +226,7 @@ std::vector SymbolMap::GetAllSymbols(SymbolType symmask) { } void SymbolMap::AddModule(const char *name, u32 address, u32 size) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); for (auto it = modules.begin(), end = modules.end(); it != end; ++it) { if (!strcmp(it->name, name)) { @@ -252,13 +252,13 @@ void SymbolMap::AddModule(const char *name, u32 address, u32 size) { } void SymbolMap::UnloadModule(u32 address, u32 size) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); activeModuleEnds.erase(address + size); UpdateActiveSymbols(); } u32 SymbolMap::GetModuleRelativeAddr(u32 address, int moduleIndex) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); if (moduleIndex == -1) { moduleIndex = GetModuleIndex(address); } @@ -272,7 +272,7 @@ u32 SymbolMap::GetModuleRelativeAddr(u32 address, int moduleIndex) const { } u32 SymbolMap::GetModuleAbsoluteAddr(u32 relative, int moduleIndex) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); for (auto it = modules.begin(), end = modules.end(); it != end; ++it) { if (it->index == moduleIndex) { return it->start + relative; @@ -282,7 +282,7 @@ u32 SymbolMap::GetModuleAbsoluteAddr(u32 relative, int moduleIndex) const { } int SymbolMap::GetModuleIndex(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto iter = activeModuleEnds.upper_bound(address); if (iter == activeModuleEnds.end()) return -1; @@ -294,7 +294,7 @@ bool SymbolMap::IsModuleActive(int moduleIndex) const { return true; } - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); for (auto it = activeModuleEnds.begin(), end = activeModuleEnds.end(); it != end; ++it) { if (it->second.index == moduleIndex) { return true; @@ -304,7 +304,7 @@ bool SymbolMap::IsModuleActive(int moduleIndex) const { } std::vector SymbolMap::getAllModules() const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); std::vector result; for (size_t i = 0; i < modules.size(); i++) { @@ -323,7 +323,7 @@ std::vector SymbolMap::getAllModules() const { } void SymbolMap::AddFunction(const char* name, u32 address, u32 size, int moduleIndex) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); if (moduleIndex == -1) { moduleIndex = GetModuleIndex(address); @@ -368,7 +368,7 @@ void SymbolMap::AddFunction(const char* name, u32 address, u32 size, int moduleI } u32 SymbolMap::GetFunctionStart(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeFunctions.upper_bound(address); if (it == activeFunctions.end()) { // check last element @@ -395,7 +395,7 @@ u32 SymbolMap::GetFunctionStart(u32 address) const { } u32 SymbolMap::GetFunctionSize(u32 startAddress) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeFunctions.find(startAddress); if (it == activeFunctions.end()) return INVALID_ADDRESS; @@ -404,7 +404,7 @@ u32 SymbolMap::GetFunctionSize(u32 startAddress) const { } int SymbolMap::GetFunctionNum(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); u32 start = GetFunctionStart(address); if (start == INVALID_ADDRESS) return INVALID_ADDRESS; @@ -417,7 +417,7 @@ int SymbolMap::GetFunctionNum(u32 address) const { } void SymbolMap::AssignFunctionIndices() { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); int index = 0; for (auto mod = activeModuleEnds.begin(), modend = activeModuleEnds.end(); mod != modend; ++mod) { int moduleIndex = mod->second.index; @@ -431,7 +431,7 @@ void SymbolMap::AssignFunctionIndices() { void SymbolMap::UpdateActiveSymbols() { // return; (slow in debug mode) - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); std::map activeModuleIndexes; for (auto it = activeModuleEnds.begin(), end = activeModuleEnds.end(); it != end; ++it) { activeModuleIndexes[it->second.index] = it->second.start; @@ -472,7 +472,7 @@ void SymbolMap::UpdateActiveSymbols() { } bool SymbolMap::SetFunctionSize(u32 startAddress, u32 newSize) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto funcInfo = activeFunctions.find(startAddress); if (funcInfo != activeFunctions.end()) { @@ -489,7 +489,7 @@ bool SymbolMap::SetFunctionSize(u32 startAddress, u32 newSize) { } bool SymbolMap::RemoveFunction(u32 startAddress, bool removeName) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeFunctions.find(startAddress); if (it == activeFunctions.end()) @@ -518,7 +518,7 @@ bool SymbolMap::RemoveFunction(u32 startAddress, bool removeName) { } void SymbolMap::AddLabel(const char* name, u32 address, int moduleIndex) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); if (moduleIndex == -1) { moduleIndex = GetModuleIndex(address); @@ -562,7 +562,7 @@ void SymbolMap::AddLabel(const char* name, u32 address, int moduleIndex) { } void SymbolMap::SetLabelName(const char* name, u32 address, bool updateImmediately) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto labelInfo = activeLabels.find(address); if (labelInfo == activeLabels.end()) { AddLabel(name, address); @@ -583,7 +583,7 @@ void SymbolMap::SetLabelName(const char* name, u32 address, bool updateImmediate } const char *SymbolMap::GetLabelName(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeLabels.find(address); if (it == activeLabels.end()) return NULL; @@ -592,7 +592,7 @@ const char *SymbolMap::GetLabelName(u32 address) const { } const char *SymbolMap::GetLabelNameRel(u32 relAddress, int moduleIndex) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = labels.find(std::make_pair(moduleIndex, relAddress)); if (it == labels.end()) return NULL; @@ -601,7 +601,7 @@ const char *SymbolMap::GetLabelNameRel(u32 relAddress, int moduleIndex) const { } std::string SymbolMap::GetLabelString(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); const char *label = GetLabelName(address); if (label == NULL) return ""; @@ -609,7 +609,7 @@ std::string SymbolMap::GetLabelString(u32 address) const { } bool SymbolMap::GetLabelValue(const char* name, u32& dest) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); for (auto it = activeLabels.begin(); it != activeLabels.end(); it++) { if (strcasecmp(name, it->second.name) == 0) { dest = it->first; @@ -621,7 +621,7 @@ bool SymbolMap::GetLabelValue(const char* name, u32& dest) { } void SymbolMap::AddData(u32 address, u32 size, DataType type, int moduleIndex) { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); if (moduleIndex == -1) { moduleIndex = GetModuleIndex(address); @@ -665,7 +665,7 @@ void SymbolMap::AddData(u32 address, u32 size, DataType type, int moduleIndex) { } u32 SymbolMap::GetDataStart(u32 address) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeData.upper_bound(address); if (it == activeData.end()) { @@ -695,7 +695,7 @@ u32 SymbolMap::GetDataStart(u32 address) const { } u32 SymbolMap::GetDataSize(u32 startAddress) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeData.find(startAddress); if (it == activeData.end()) return INVALID_ADDRESS; @@ -703,7 +703,7 @@ u32 SymbolMap::GetDataSize(u32 startAddress) const { } DataType SymbolMap::GetDataType(u32 startAddress) const { - Threading::ScopedLock guard(lock_); + std::lock_guard guard(m_lock); auto it = activeData.find(startAddress); if (it == activeData.end()) return DATATYPE_NONE; diff --git a/pcsx2/DebugTools/SymbolMap.h b/pcsx2/DebugTools/SymbolMap.h index b499877632..9d9d64bb8c 100644 --- a/pcsx2/DebugTools/SymbolMap.h +++ b/pcsx2/DebugTools/SymbolMap.h @@ -19,8 +19,8 @@ #include #include #include +#include -#include "Utilities/Threading.h" #include "Pcsx2Types.h" enum SymbolType { @@ -145,7 +145,7 @@ private: std::map data; std::vector modules; - mutable Threading::MutexRecursive lock_; + mutable std::recursive_mutex m_lock; }; extern SymbolMap symbolMap;