mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 06:09:50 -06:00
Merge pull request #13783 from jordan-woyak/schedule-event-from-thread-fix
CoreTiming: Fix unsafe usage of m_globals.global_timer in ScheduleEvent from non-CPU thread.
This commit is contained in:
@ -305,17 +305,9 @@ TEST(CoreTiming, ScheduleIntoPast)
|
||||
|
||||
AdvanceAndCheck(system, 0, MAX_SLICE_LENGTH, 1000); // Run cb_chain into late cb_a
|
||||
|
||||
// Schedule late from wrong thread
|
||||
// The problem with scheduling CPU events from outside the CPU Thread is that g_global_timer
|
||||
// is not reliable outside the CPU Thread. It's possible for the other thread to sample the
|
||||
// global timer right before the timer is updated by Advance() then submit a new event using
|
||||
// the stale value, i.e. effectively half-way through the previous slice.
|
||||
// NOTE: We're only testing that the scheduler doesn't break, not whether this makes sense.
|
||||
// Schedule directly into the past from wrong thread.
|
||||
Core::UndeclareAsCPUThread();
|
||||
auto& core_timing_globals = core_timing.GetGlobals();
|
||||
core_timing_globals.global_timer -= 1000;
|
||||
core_timing.ScheduleEvent(0, cb_b, CB_IDS[1], CoreTiming::FromThread::NON_CPU);
|
||||
core_timing_globals.global_timer += 1000;
|
||||
core_timing.ScheduleEvent(-1000, cb_b, CB_IDS[1], CoreTiming::FromThread::NON_CPU);
|
||||
Core::DeclareAsCPUThread();
|
||||
AdvanceAndCheck(system, 1, MAX_SLICE_LENGTH, MAX_SLICE_LENGTH + 1000);
|
||||
|
||||
|
Reference in New Issue
Block a user