summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/core_timing.cpp33
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