Correct delay for sceKernelDelayThread(0).

It's not 200 for 0, more like 100ish.
This commit is contained in:
Unknown W. Brackets 2013-05-04 23:18:13 -07:00
parent f1f2cf0603
commit bf826ed9c1

View file

@ -2197,24 +2197,32 @@ void sceKernelChangeThreadPriority()
}
}
s64 __KernelDelayThreadUs(u64 usec)
{
// Seems to very based on clockrate / other things, but 0 delays less than 200us for sure.
if (usec == 0)
return 100;
else if (usec < 200)
return 200;
return usec;
}
int sceKernelDelayThreadCB(u32 usec)
{
if (usec < 200) usec = 200;
DEBUG_LOG(HLE,"sceKernelDelayThreadCB(%i usec)",usec);
SceUID curThread = __KernelGetCurThread();
__KernelScheduleWakeup(curThread, usec);
__KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec));
__KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed");
return 0;
}
int sceKernelDelayThread(u32 usec)
{
if (usec < 200) usec = 200;
DEBUG_LOG(HLE,"sceKernelDelayThread(%i usec)",usec);
SceUID curThread = __KernelGetCurThread();
__KernelScheduleWakeup(curThread, usec);
__KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec));
__KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed");
return 0;
}
@ -2232,11 +2240,10 @@ void sceKernelDelaySysClockThreadCB()
// TODO: Which unit?
u64 usec = sysclock.lo | ((u64)sysclock.hi << 32);
if (usec < 200) usec = 200;
DEBUG_LOG(HLE, "sceKernelDelaySysClockThread(%08x (%llu))", sysclockAddr, usec);
SceUID curThread = __KernelGetCurThread();
__KernelScheduleWakeup(curThread, usec);
__KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec));
__KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, true, "thread delayed");
}
@ -2253,11 +2260,10 @@ void sceKernelDelaySysClockThread()
// TODO: Which unit?
u64 usec = sysclock.lo | ((u64)sysclock.hi << 32);
if (usec < 200) usec = 200;
DEBUG_LOG(HLE, "sceKernelDelaySysClockThread(%08x (%llu))", sysclockAddr, usec);
SceUID curThread = __KernelGetCurThread();
__KernelScheduleWakeup(curThread, usec);
__KernelScheduleWakeup(curThread, __KernelDelayThreadUs(usec));
__KernelWaitCurThread(WAITTYPE_DELAY, curThread, 0, 0, false, "thread delayed");
}