This commit is contained in:
CookedBunny 2025-12-16 11:20:32 +08:00 committed by GitHub
commit 580bd31044
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 12 deletions

View File

@ -65,19 +65,26 @@ bool EqueueInternal::ScheduleEvent(u64 id, s16 filter,
it->timer->expires_at(it->timer->expiry() + event.timer_interval);
}
it->timer->async_wait(
[this, event_data = event.event, callback](const boost::system::error_code& ec) {
if (ec) {
if (ec != boost::system::errc::operation_canceled) {
LOG_ERROR(Kernel_Event, "Timer callback error: {}", ec.message());
} else {
// Timer was cancelled (removed) before it triggered
LOG_DEBUG(Kernel_Event, "Timer cancelled");
}
return;
std::weak_ptr weak_token = m_life_token;
it->timer->async_wait([this, event_data = event.event, callback,
weak_token](const boost::system::error_code& ec) {
// If the token already expires return to avoid calling to callback with an invalid pointer.
if (weak_token.expired()) {
return;
}
if (ec) {
if (ec != boost::system::errc::operation_canceled) {
LOG_ERROR(Kernel_Event, "Timer callback error: {}", ec.message());
} else {
// Timer was cancelled (removed) before it triggered
LOG_DEBUG(Kernel_Event, "Timer cancelled");
}
callback(this, event_data);
});
return;
}
callback(this, event_data);
});
KernelSignalRequest();
return true;

View File

@ -180,6 +180,7 @@ private:
std::vector<EqueueEvent> m_events;
std::condition_variable m_cond;
std::unordered_map<u64, SmallTimer> m_small_timers;
std::shared_ptr<void> m_life_token = std::make_shared<int>(0);
};
u64 PS4_SYSV_ABI sceKernelGetEventData(const SceKernelEvent* ev);