Merge pull request #1470 from oneandonlydean/up/waitmemory-race
fix(agc): guard the reported wait-timeout set against concurrent queues
This commit is contained in:
commit
050538528a
|
|
@ -5,6 +5,8 @@
|
|||
#include "prx/libSceAgcDriver/Execution/include/GuestMemory.hpp"
|
||||
#include "prx/libSceAgcDriver/Execution/include/Pm4.hpp"
|
||||
#include <cstdlib>
|
||||
#include <mutex>
|
||||
#include <set>
|
||||
#ifdef _WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
|
@ -287,10 +289,14 @@ void Driver::waitMemory(std::span<const std::uint32_t> packet, std::uint32_t que
|
|||
if (!warned && std::chrono::steady_clock::now() - start > std::chrono::milliseconds(waitTimeoutMs())) {
|
||||
warned = true;
|
||||
++outcomes.timedOut;
|
||||
static std::set<std::uint64_t> reported;
|
||||
static std::uint64_t timeouts = 0;
|
||||
if (++timeouts % 20 == 0) std::fprintf(stderr, "[gpu] %llu GPU waits have timed out\n", static_cast<unsigned long long>(timeouts));
|
||||
if (!reported.insert(packet[2] | (static_cast<std::uint64_t>(packet[3]) << 32u)).second) return;
|
||||
{
|
||||
static std::mutex reportedMutex;
|
||||
static std::set<std::uint64_t> reported;
|
||||
static std::uint64_t timeouts = 0;
|
||||
const std::lock_guard lock(reportedMutex);
|
||||
if (++timeouts % 20 == 0) std::fprintf(stderr, "[gpu] %llu GPU waits have timed out\n", static_cast<unsigned long long>(timeouts));
|
||||
if (!reported.insert(packet[2] | (static_cast<std::uint64_t>(packet[3]) << 32u)).second) return;
|
||||
}
|
||||
const bool wide = ((packet[0] >> 8u) & 0xffu) == 0x93u;
|
||||
const std::uint64_t reference = wide ? packet[4] | (static_cast<std::uint64_t>(packet[5]) << 32u) : packet[4];
|
||||
const std::uint64_t mask = wide ? packet[6] | (static_cast<std::uint64_t>(packet[7]) << 32u) : packet[5];
|
||||
|
|
|
|||
Loading…
Reference in New Issue