diff options
-rw-r--r-- | src/core/core_timing.cpp | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp index 65f0df115..e671b270f 100644 --- a/src/core/core_timing.cpp +++ b/src/core/core_timing.cpp @@ -203,19 +203,31 @@ std::optional<s64> CoreTiming::Advance() { global_timer = GetGlobalTimeNs().count(); while (!event_queue.empty() && event_queue.top().time <= global_timer) { - Event evt = event_queue.top(); - event_queue.pop(); + const Event& evt = event_queue.top(); if (const auto event_type{evt.type.lock()}) { - basic_lock.unlock(); + if (evt.reschedule_time == 0) { + const auto evt_user_data = evt.user_data; + const auto evt_time = evt.time; - const auto new_schedule_time{event_type->callback( - evt.user_data, evt.time, - std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt.time})}; + event_queue.pop(); - basic_lock.lock(); + basic_lock.unlock(); + + event_type->callback( + evt_user_data, evt_time, + std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time}); + + basic_lock.lock(); + } else { + basic_lock.unlock(); + + const auto new_schedule_time{event_type->callback( + evt.user_data, evt.time, + std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt.time})}; + + basic_lock.lock(); - if (evt.reschedule_time != 0) { const auto next_schedule_time{new_schedule_time.has_value() ? new_schedule_time.value().count() : evt.reschedule_time}; @@ -227,9 +239,8 @@ std::optional<s64> CoreTiming::Advance() { next_time = pause_end_time + next_schedule_time; } - auto h{event_queue.emplace(Event{next_time, event_fifo_id++, evt.user_data, - evt.type, next_schedule_time})}; - (*h).handle = h; + event_queue.update(evt.handle, Event{next_time, event_fifo_id++, evt.user_data, + evt.type, next_schedule_time, evt.handle}); } } |