mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-19 18:36:53 +02:00
Remove redundant tracking lock checks from the hot path
This commit is contained in:
@@ -30,21 +30,14 @@ class TrackingSpinLock final {
|
|||||||
public:
|
public:
|
||||||
void lock() noexcept {
|
void lock() noexcept {
|
||||||
const auto thread = CurrentThread();
|
const auto thread = CurrentThread();
|
||||||
if (m_owner.load(std::memory_order_relaxed) == thread) {
|
|
||||||
EXIT("recursive region tracking lock\n");
|
|
||||||
}
|
|
||||||
while (m_lock.test_and_set(std::memory_order_acquire)) {
|
while (m_lock.test_and_set(std::memory_order_acquire)) {
|
||||||
if (m_owner.load(std::memory_order_relaxed) == thread) {
|
EXIT_NOT_IMPLEMENTED(m_owner.load(std::memory_order_relaxed) == thread);
|
||||||
EXIT("recursive region tracking lock while contended\n");
|
|
||||||
}
|
|
||||||
std::atomic_signal_fence(std::memory_order_seq_cst);
|
std::atomic_signal_fence(std::memory_order_seq_cst);
|
||||||
}
|
}
|
||||||
m_owner.store(thread, std::memory_order_relaxed);
|
m_owner.store(thread, std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
void unlock() noexcept {
|
void unlock() noexcept {
|
||||||
if (m_owner.load(std::memory_order_relaxed) != CurrentThread()) {
|
EXIT_NOT_IMPLEMENTED(m_owner.load(std::memory_order_relaxed) != CurrentThread());
|
||||||
EXIT("region tracking lock released by non-owner\n");
|
|
||||||
}
|
|
||||||
m_owner.store(0, std::memory_order_relaxed);
|
m_owner.store(0, std::memory_order_relaxed);
|
||||||
m_lock.clear(std::memory_order_release);
|
m_lock.clear(std::memory_order_release);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -871,6 +871,15 @@ void TestFullRegionGpuUnmarkBatching() {
|
|||||||
[&]() noexcept {
|
[&]() noexcept {
|
||||||
(void)tracker.IsRegionCpuModified(address, page_size);
|
(void)tracker.IsRegionCpuModified(address, page_size);
|
||||||
});
|
});
|
||||||
|
} else if (std::strcmp(name, "recursive-tracking-lock") == 0) {
|
||||||
|
Libs::Graphics::TrackingSpinLock lock;
|
||||||
|
lock.lock();
|
||||||
|
lock.lock();
|
||||||
|
} else if (std::strcmp(name, "non-owner-tracking-unlock") == 0) {
|
||||||
|
Libs::Graphics::TrackingSpinLock lock;
|
||||||
|
lock.lock();
|
||||||
|
std::thread worker([&] { lock.unlock(); });
|
||||||
|
worker.join();
|
||||||
}
|
}
|
||||||
std::_Exit(0x7f);
|
std::_Exit(0x7f);
|
||||||
}
|
}
|
||||||
@@ -928,7 +937,8 @@ void CheckDeathCase(const char *name) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TestFatalPaths() {
|
void TestFatalPaths() {
|
||||||
for (const char *name : {"gpu-dirty-explicit-cpu", "reentrant-upload"}) {
|
for (const char *name : {"gpu-dirty-explicit-cpu", "reentrant-upload",
|
||||||
|
"recursive-tracking-lock", "non-owner-tracking-unlock"}) {
|
||||||
CheckDeathCase(name);
|
CheckDeathCase(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user