equeue: Move small timer check to WaitForEvents. (#3000)
Some checks are pending
Build and Release / reuse (push) Waiting to run
Build and Release / clang-format (push) Waiting to run
Build and Release / get-info (push) Waiting to run
Build and Release / windows-sdl (push) Blocked by required conditions
Build and Release / windows-qt (push) Blocked by required conditions
Build and Release / macos-sdl (push) Blocked by required conditions
Build and Release / macos-qt (push) Blocked by required conditions
Build and Release / linux-sdl (push) Blocked by required conditions
Build and Release / linux-qt (push) Blocked by required conditions
Build and Release / linux-sdl-gcc (push) Blocked by required conditions
Build and Release / linux-qt-gcc (push) Blocked by required conditions
Build and Release / pre-release (push) Blocked by required conditions

This commit is contained in:
squidbus 2025-05-28 09:54:47 -07:00 committed by GitHub
parent e0309a4b01
commit 95f04b746d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -98,6 +98,11 @@ bool EqueueInternal::RemoveEvent(u64 id, s16 filter) {
} }
int EqueueInternal::WaitForEvents(SceKernelEvent* ev, int num, u32 micros) { int EqueueInternal::WaitForEvents(SceKernelEvent* ev, int num, u32 micros) {
if (HasSmallTimer()) {
// If a small timer is set, just wait for it to expire.
return WaitForSmallTimer(ev, num, micros);
}
int count = 0; int count = 0;
const auto predicate = [&] { const auto predicate = [&] {
@ -267,27 +272,15 @@ int PS4_SYSV_ABI sceKernelWaitEqueue(SceKernelEqueue eq, SceKernelEvent* ev, int
return ORBIS_KERNEL_ERROR_EINVAL; return ORBIS_KERNEL_ERROR_EINVAL;
} }
// When the timeout is nullptr, we wait indefinitely if (timo == nullptr) {
if (eq->HasSmallTimer()) { // When the timeout is nullptr, we wait indefinitely
if (timo == nullptr) { *out = eq->WaitForEvents(ev, num, 0);
*out = eq->WaitForSmallTimer(ev, num, 0); } else if (*timo == 0) {
} else if (*timo == 0) { // Only events that have already arrived at the time of this function call can be received
// Only events that have already arrived at the time of this function call can be *out = eq->GetTriggeredEvents(ev, num);
// received
*out = eq->GetTriggeredEvents(ev, num);
} else {
*out = eq->WaitForSmallTimer(ev, num, *timo);
}
} else { } else {
if (timo == nullptr) { // Wait for up to the specified timeout value
*out = eq->WaitForEvents(ev, num, 0); *out = eq->WaitForEvents(ev, num, *timo);
} else if (*timo == 0) {
// Only events that have already arrived at the time of this function call can be
// received
*out = eq->GetTriggeredEvents(ev, num);
} else {
*out = eq->WaitForEvents(ev, num, *timo);
}
} }
if (*out == 0) { if (*out == 0) {