From 65820d6184be3f8946b20c55d404f1dbc2eb4487 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 May 2016 22:04:47 -0700 Subject: [PATCH] Thread: Use a short delay for 0us delays after all. It seems the behavior varies. Should help #6924 and #6981. --- Core/HLE/sceKernelThread.cpp | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 978defe8a3..3b54699ebe 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2410,30 +2410,24 @@ static s64 __KernelDelayThreadUs(u64 usec) { int sceKernelDelayThreadCB(u32 usec) { hleEatCycles(2000); - if (usec > 0) { - DEBUG_LOG(SCEKERNEL, "sceKernelDelayThreadCB(%i usec)", usec); - SceUID curThread = __KernelGetCurThread(); - __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); - __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed"); - } else { - DEBUG_LOG(SCEKERNEL, "sceKernelDelayThreadCB(%i usec): no delay", usec); - hleReSchedule("thread delayed"); - } - return 0; + // Note: Sometimes (0) won't delay, potentially based on how much the thread is doing. + // But a loop with just 0 often does delay, and games depend on this. So we err on that side. + SceUID curThread = __KernelGetCurThread(); + s64 delayUs = __KernelDelayThreadUs(usec); + __KernelScheduleWakeup(curThread, delayUs); + __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed"); + return hleLogSuccessI(SCEKERNEL, 0, "delaying %lld usecs", delayUs); } int sceKernelDelayThread(u32 usec) { hleEatCycles(2000); - if (usec > 0) { - DEBUG_LOG(SCEKERNEL, "sceKernelDelayThread(%i usec)", usec); - SceUID curThread = __KernelGetCurThread(); - __KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec)); - __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed"); - } else { - DEBUG_LOG(SCEKERNEL, "sceKernelDelayThread(%i usec): no delay", usec); - hleReSchedule("thread delayed"); - } - return 0; + // Note: Sometimes (0) won't delay, potentially based on how much the thread is doing. + // But a loop with just 0 often does delay, and games depend on this. So we err on that side. + SceUID curThread = __KernelGetCurThread(); + s64 delayUs = __KernelDelayThreadUs(usec); + __KernelScheduleWakeup(curThread, delayUs); + __KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed"); + return hleLogSuccessI(SCEKERNEL, 0, "delaying %lld usecs", delayUs); } int sceKernelDelaySysClockThreadCB(u32 sysclockAddr)