From 4d37c933645386b44a8a3dcaedd2e153b9be8d41 Mon Sep 17 00:00:00 2001 From: Mohamed Aziz Hadjkacem Date: Mon, 12 Oct 2026 16:51:53 +0100 Subject: [PATCH] fix(agc,shader): prime the two host shared mutexes added after 48dcaace7 Commit 48dcaace7 introduced PrimedSharedMutex and converted every host std::shared_mutex that existed at the time, because winpthreads initializes a static rwlock on first use and a concurrent first lock returns EINVAL, which std::shared_mutex ignores (docs/dev/TechnicalDebt.md:10). Two host mutexes were added afterward and missed the conversion: - Recompiler.cpp registrationModule() static mutex (added by baf3437465) - MultisampleTarget.cpp guardedMutex() static mutex (added by d109f3966f) Apply the same priming. Recompiler.cpp reuses the PrimedSharedMutex already defined in that translation unit; MultisampleTarget.cpp gets the identical local helper to match the existing inline precedent. Tested: Windows 11 x64, WinLibs GCC 15.2.0 (matches CI). Compiled Recompiler.cpp.obj and all three MultisampleTarget.cpp.obj targets with the project build flags; check_conventions.py passes. --- .../libSceAgcDriver/Graphics/src/MultisampleTarget.cpp | 10 +++++++++- core/shader/recompiler/Recompiler.cpp | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp index 743b469cd..911526572 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp @@ -173,8 +173,16 @@ struct GuardedRange { std::uint32_t samples; }; +class PrimedSharedMutex : public std::shared_mutex { +public: + PrimedSharedMutex() { + lock(); + unlock(); + } +}; + std::shared_mutex& guardedMutex() { - static std::shared_mutex mutex; + static PrimedSharedMutex mutex; return mutex; } diff --git a/core/shader/recompiler/Recompiler.cpp b/core/shader/recompiler/Recompiler.cpp index 2a214225d..436a93ad7 100644 --- a/core/shader/recompiler/Recompiler.cpp +++ b/core/shader/recompiler/Recompiler.cpp @@ -623,7 +623,7 @@ struct RegistrationModuleEntry { std::shared_ptr registrationModule(std::uint64_t variantId, std::span moduleKey, const std::function()>& specialize) { std::vector key{variantId}; key.insert(key.end(), moduleKey.begin(), moduleKey.end()); - static std::shared_mutex mutex; + static PrimedSharedMutex mutex; static std::map, std::shared_ptr> modules; std::shared_ptr entry; {