Remove reader_lock executed in every instruction by RSX

Use optimistic double check instead, use one load instruction for the check to be atomic

+ Read emu status once every FIFO iteration
This commit is contained in:
eladash 2019-03-31 18:56:27 +03:00 committed by Ivan
parent f25587d24c
commit 888cb9d673
1 changed files with 22 additions and 13 deletions

View File

@ -527,7 +527,7 @@ namespace rsx
fesetround(FE_TONEAREST);
// TODO: exit condition
while (!Emu.IsStopped())
while (true)
{
// Wait for external pause events
if (external_interrupt_lock.load())
@ -536,13 +536,6 @@ namespace rsx
while (external_interrupt_lock.load()) _mm_pause();
}
// Idle if emulation paused
if (Emu.IsPaused())
{
std::this_thread::sleep_for(1ms);
continue;
}
// Note a possible rollback address
if (sync_point_request)
{
@ -559,6 +552,20 @@ namespace rsx
// Execute FIFO queue
run_FIFO();
if (!Emu.IsRunning())
{
// Idle if emulation paused
while (Emu.IsPaused())
{
std::this_thread::sleep_for(1ms);
}
if (Emu.IsStopped())
{
break;
}
}
}
}
@ -900,12 +907,14 @@ namespace rsx
if (!in_begin_end && state != FIFO_state::lock_wait)
{
reader_lock lock(m_mtx_task);
if (m_invalidated_memory_range.valid())
if (atomic_storage<u32>::load(m_invalidated_memory_range.end) != 0)
{
lock.upgrade();
handle_invalidated_memory_range();
std::lock_guard lock(m_mtx_task);
if (m_invalidated_memory_range.valid())
{
handle_invalidated_memory_range();
}
}
}
}