From bfe4892be124c6e7504fa6dc6f7419bb3a174001 Mon Sep 17 00:00:00 2001 From: BunnyFl <166477956+BunnyFl@users.noreply.github.com> Date: Mon, 2 Nov 2026 02:05:03 +0100 Subject: [PATCH] fix(agc,libkernel): prime the host shared mutexes left unprimed on Windows winpthreads initializes a statically initialized rwlock on its first lock and fails a concurrent first lock with EINVAL, which std::shared_mutex ignores, so that lock does not exclude (docs/dev/debt/shader.md). Lock depthGuardMutex, PipelineCacheSynchronization's mutex and the event flag registry mutex once when created, through a PrimedSharedMutex shared from a libc header. Co-Authored-By: Claude Opus 5.5 --- .../libSceAgcDriver/Graphics/include/Context.hpp | 3 ++- .../libSceAgcDriver/Graphics/src/DepthSurface.cpp | 3 ++- .../Graphics/src/MultisampleTarget.cpp | 9 +-------- core/libs/prx/libc/include/PrimedSharedMutex.hpp | 14 ++++++++++++++ .../libs/prx/libkernel/EventFlag/src/EventFlag.cpp | 3 ++- 5 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 core/libs/prx/libc/include/PrimedSharedMutex.hpp diff --git a/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp b/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp index 985840aef9..855d3c7873 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/include/Context.hpp @@ -6,6 +6,7 @@ #endif #include #include +#include "prx/libc/include/PrimedSharedMutex.hpp" #include #include #include @@ -46,7 +47,7 @@ public: SnapshotLock TryLockForSnapshot() const { return SnapshotLock(mutex, std::try_to_lock); } private: - mutable std::shared_mutex mutex; + mutable PrimedSharedMutex mutex; }; inline void Require(bool condition, const std::string& reason) { diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp index 77566d0d96..ac80e3921c 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/DepthSurface.cpp @@ -2,6 +2,7 @@ #include "prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include "prx/libc/include/GuestAllocations.hpp" +#include "prx/libc/include/PrimedSharedMutex.hpp" #include "prx/libSceAgcDriver/Graphics/include/BufferPool.hpp" #include "prx/libSceAgcDriver/Graphics/include/Recorder.hpp" #include "prx/libSceAgcDriver/Graphics/include/GuestBufferMemory.hpp" @@ -82,7 +83,7 @@ struct DepthGuard { }; std::shared_mutex& depthGuardMutex() { - static std::shared_mutex mutex; + static PrimedSharedMutex mutex; return mutex; } diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp index c0ac9798e8..e6fc8bc491 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/MultisampleTarget.cpp @@ -16,6 +16,7 @@ #include "IntermediateRepresentation/IrMetadata/BufferFormat.hpp" #include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp" #include "prx/libc/include/GuestAllocations.hpp" +#include "prx/libc/include/PrimedSharedMutex.hpp" #include #include #include @@ -774,14 +775,6 @@ struct GuardedRange { bool fmask = false; }; -class PrimedSharedMutex : public std::shared_mutex { -public: - PrimedSharedMutex() { - lock(); - unlock(); - } -}; - std::shared_mutex& guardedMutex() { static PrimedSharedMutex mutex; return mutex; diff --git a/core/libs/prx/libc/include/PrimedSharedMutex.hpp b/core/libs/prx/libc/include/PrimedSharedMutex.hpp new file mode 100644 index 0000000000..7f6a9d8e7f --- /dev/null +++ b/core/libs/prx/libc/include/PrimedSharedMutex.hpp @@ -0,0 +1,14 @@ +#ifndef CORE_LIBS_PRX_LIBC_INCLUDE_PRIMEDSHAREDMUTEX_HPP +#define CORE_LIBS_PRX_LIBC_INCLUDE_PRIMEDSHAREDMUTEX_HPP + +#include + +class PrimedSharedMutex : public std::shared_mutex { +public: + PrimedSharedMutex() { + lock(); + unlock(); + } +}; + +#endif diff --git a/core/libs/prx/libkernel/EventFlag/src/EventFlag.cpp b/core/libs/prx/libkernel/EventFlag/src/EventFlag.cpp index 65ae972430..4351a30052 100644 --- a/core/libs/prx/libkernel/EventFlag/src/EventFlag.cpp +++ b/core/libs/prx/libkernel/EventFlag/src/EventFlag.cpp @@ -4,6 +4,7 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libc/include/PrimedSharedMutex.hpp" #include "prx/libkernel/Time/include/Time.hpp" #include "prx/libkernel/Time/include/TimedWait.hpp" #include @@ -97,7 +98,7 @@ struct EventFlagHandle { bool opened = false; }; -std::shared_mutex eventFlagRegistryMutex; +PrimedSharedMutex eventFlagRegistryMutex; std::unordered_map> eventFlagRegistry; std::shared_ptr ResolveEventFlag(KernelEventFlag handle) {