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() { | |||
| 203 | global_timer = GetGlobalTimeNs().count(); | 203 | global_timer = GetGlobalTimeNs().count(); |
| 204 | 204 | ||
| 205 | while (!event_queue.empty() && event_queue.top().time <= global_timer) { | 205 | while (!event_queue.empty() && event_queue.top().time <= global_timer) { |
| 206 | Event evt = event_queue.top(); | 206 | const Event& evt = event_queue.top(); |
| 207 | event_queue.pop(); | ||
| 208 | 207 | ||
| 209 | if (const auto event_type{evt.type.lock()}) { | 208 | if (const auto event_type{evt.type.lock()}) { |
| 210 | basic_lock.unlock(); | 209 | if (evt.reschedule_time == 0) { |
| 210 | const auto evt_user_data = evt.user_data; | ||
| 211 | const auto evt_time = evt.time; | ||
| 211 | 212 | ||
| 212 | const auto new_schedule_time{event_type->callback( | 213 | event_queue.pop(); |
| 213 | evt.user_data, evt.time, | ||
| 214 | std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt.time})}; | ||
| 215 | 214 | ||
| 216 | basic_lock.lock(); | 215 | basic_lock.unlock(); |
| 216 | |||
| 217 | event_type->callback( | ||
| 218 | evt_user_data, evt_time, | ||
| 219 | std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt_time}); | ||
| 220 | |||
| 221 | basic_lock.lock(); | ||
| 222 | } else { | ||
| 223 | basic_lock.unlock(); | ||
| 224 | |||
| 225 | const auto new_schedule_time{event_type->callback( | ||
| 226 | evt.user_data, evt.time, | ||
| 227 | std::chrono::nanoseconds{GetGlobalTimeNs().count() - evt.time})}; | ||
| 228 | |||
| 229 | basic_lock.lock(); | ||
| 217 | 230 | ||
| 218 | if (evt.reschedule_time != 0) { | ||
| 219 | const auto next_schedule_time{new_schedule_time.has_value() | 231 | const auto next_schedule_time{new_schedule_time.has_value() |
| 220 | ? new_schedule_time.value().count() | 232 | ? new_schedule_time.value().count() |
| 221 | : evt.reschedule_time}; | 233 | : evt.reschedule_time}; |
| @@ -227,9 +239,8 @@ std::optional<s64> CoreTiming::Advance() { | |||
| 227 | next_time = pause_end_time + next_schedule_time; | 239 | next_time = pause_end_time + next_schedule_time; |
| 228 | } | 240 | } |
| 229 | 241 | ||
| 230 | auto h{event_queue.emplace(Event{next_time, event_fifo_id++, evt.user_data, | 242 | event_queue.update(evt.handle, Event{next_time, event_fifo_id++, evt.user_data, |
| 231 | evt.type, next_schedule_time})}; | 243 | evt.type, next_schedule_time, evt.handle}); |
| 232 | (*h).handle = h; | ||
| 233 | } | 244 | } |
| 234 | } | 245 | } |
| 235 | 246 | ||