From e14ff38a37238d75f3cce8eb5e6dc2a62c0ddacc Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 16 Apr 2025 14:29:13 +0100 Subject: [PATCH] Use lock instead of atomic to protect debug files cache lookup --- renderdoc/driver/shaders/dxbc/dxbc_container.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/shaders/dxbc/dxbc_container.cpp b/renderdoc/driver/shaders/dxbc/dxbc_container.cpp index 78f014879..c56240229 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_container.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_container.cpp @@ -47,7 +47,7 @@ namespace // lookup from plain filename -> absolute path of first result in search paths std::unordered_map cachedDebugFilesLookup; -int32_t cachedDebugFilesLookupInit = 0; +Threading::CriticalSection cachedDebugFilesLookupLock; void CacheSearchDirDebugPaths(rdcstr dir) { @@ -72,16 +72,23 @@ void CacheSearchDirDebugPaths(rdcstr dir) void CacheSearchDirDebugPaths() { - if(Atomic::CmpExch32(&cachedDebugFilesLookupInit, 0, 1) != 0) + if(!RenderDoc::Inst().IsReplayApp()) return; - if(!RenderDoc::Inst().IsReplayApp()) + SCOPED_LOCK(cachedDebugFilesLookupLock); + + if(!cachedDebugFilesLookup.empty()) return; rdcarray searchPaths = DXBC_Debug_SearchDirPaths(); for(const rdcstr &base : searchPaths) + { + size_t sz = cachedDebugFilesLookup.size(); CacheSearchDirDebugPaths(base); + RDCLOG("Recursively enumerated all files under %s, found %zu files", base.c_str(), + cachedDebugFilesLookup.size() - sz); + } RDCLOG("Cached %zu debug files in %zu search paths", cachedDebugFilesLookup.size(), searchPaths.size()); @@ -93,8 +100,9 @@ namespace DXBC { void ResetSearchDirsCache() { + SCOPED_LOCK(cachedDebugFilesLookupLock); + cachedDebugFilesLookup.clear(); - cachedDebugFilesLookupInit = 0; } rdcstr BasicDemangle(const rdcstr &possiblyMangledName)