kernel: Fix sleep timing accuracy (#2828)
* kernel: Fix sleep timing accuracy This commit corrects some mistake while comparing reversing of kernel 13.x with our own. WaitAndCheckScheduledObjects timing accuracy was also improved. * Make KTimeManager.WaitAndCheckScheduledObjects spin wait for sub milliseconds Fix performance regression on Pokemon Let's Go games and possibly others. * Address rip's comment * kernel: Fix issues with timeout of -1 (0xFFFFFFFF) Fixes possible hang on Pokemon DP and possibly others
This commit is contained in:
parent
786fb04d20
commit
7b040e51b0
2 changed files with 85 additions and 7 deletions
|
@ -506,6 +506,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
return KernelResult.UserCopyFailed;
|
||||
}
|
||||
|
||||
if (timeout > 0)
|
||||
{
|
||||
timeout += KTimeManager.DefaultTimeIncrementNanoseconds;
|
||||
}
|
||||
|
||||
return ReplyAndReceive(handles, replyTargetHandle, timeout, out handleIndex);
|
||||
}
|
||||
|
||||
|
@ -547,6 +552,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
if (result == KernelResult.Success)
|
||||
{
|
||||
if (timeout > 0)
|
||||
{
|
||||
timeout += KTimeManager.DefaultTimeIncrementNanoseconds;
|
||||
}
|
||||
|
||||
while ((result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == KernelResult.Success)
|
||||
{
|
||||
KServerSession session = currentProcess.HandleTable.GetObject<KServerSession>(handles[handleIndex]);
|
||||
|
@ -644,6 +654,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
if (result == KernelResult.Success)
|
||||
{
|
||||
if (timeout > 0)
|
||||
{
|
||||
timeout += KTimeManager.DefaultTimeIncrementNanoseconds;
|
||||
}
|
||||
|
||||
while ((result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex)) == KernelResult.Success)
|
||||
{
|
||||
KServerSession session = currentProcess.HandleTable.GetObject<KServerSession>(handles[handleIndex]);
|
||||
|
@ -2117,7 +2132,7 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
}
|
||||
else
|
||||
{
|
||||
KernelStatic.GetCurrentThread().Sleep(timeout);
|
||||
KernelStatic.GetCurrentThread().Sleep(timeout + KTimeManager.DefaultTimeIncrementNanoseconds);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2458,6 +2473,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
}
|
||||
}
|
||||
|
||||
if (timeout > 0)
|
||||
{
|
||||
timeout += KTimeManager.DefaultTimeIncrementNanoseconds;
|
||||
}
|
||||
|
||||
KernelResult result = _context.Synchronization.WaitFor(syncObjs, timeout, out handleIndex);
|
||||
|
||||
if (result == KernelResult.PortRemoteClosed)
|
||||
|
@ -2541,6 +2561,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (timeout > 0)
|
||||
{
|
||||
timeout += KTimeManager.DefaultTimeIncrementNanoseconds;
|
||||
}
|
||||
|
||||
return currentProcess.AddressArbiter.WaitProcessWideKeyAtomic(
|
||||
mutexAddress,
|
||||
condVarAddress,
|
||||
|
@ -2571,6 +2596,11 @@ namespace Ryujinx.HLE.HOS.Kernel.SupervisorCall
|
|||
|
||||
KProcess currentProcess = KernelStatic.GetCurrentProcess();
|
||||
|
||||
if (timeout > 0)
|
||||
{
|
||||
timeout += KTimeManager.DefaultTimeIncrementNanoseconds;
|
||||
}
|
||||
|
||||
return type switch
|
||||
{
|
||||
ArbitrationType.WaitIfLessThan
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue