From 10096b94f2ba0b6308f2bc9eb5da2b28a3665efa Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 28 Jun 2014 03:06:30 -0700 Subject: [PATCH] Correctly remember callback status when sleeping. If a callback triggered right away after a sceKernelSleepThreadCB(), it would trigger the "current callback" and remember callback status as false, instead of true (since it was set later.) This corrects that by ignoring it if both are set. --- Core/HLE/HLE.cpp | 2 +- Core/HLE/sceKernelThread.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index e6974855a7..adf2ba12b5 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -378,7 +378,7 @@ inline void hleFinishSyscall(const HLEFunction &info) if ((hleAfterSyscall & HLE_AFTER_SKIP_DEADBEEF) == 0) SetDeadbeefRegs(); - if ((hleAfterSyscall & HLE_AFTER_CURRENT_CALLBACKS) != 0) + if ((hleAfterSyscall & HLE_AFTER_CURRENT_CALLBACKS) != 0 && (hleAfterSyscall & HLE_AFTER_RESCHED_CALLBACKS) == 0) __KernelForceCallbacks(); if ((hleAfterSyscall & HLE_AFTER_RUN_INTERRUPTS) != 0) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index e040a6255e..73cf66735b 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2758,7 +2758,6 @@ int sceKernelSleepThread() int sceKernelSleepThreadCB() { VERBOSE_LOG(SCEKERNEL, "sceKernelSleepThreadCB()"); - hleCheckCurrentCallbacks(); return __KernelSleepThread(true); } @@ -2810,7 +2809,6 @@ int sceKernelWaitThreadEndCB(SceUID threadID, u32 timeoutPtr) Thread *t = kernelObjects.Get(threadID, error); if (t) { - hleCheckCurrentCallbacks(); if (t->nt.status != THREADSTATUS_DORMANT) { if (Memory::IsValidAddress(timeoutPtr)) @@ -2819,6 +2817,8 @@ int sceKernelWaitThreadEndCB(SceUID threadID, u32 timeoutPtr) t->waitingThreads.push_back(currentThread); __KernelWaitCurThread(WAITTYPE_THREADEND, threadID, 0, timeoutPtr, true, "thread wait end"); } + else + hleCheckCurrentCallbacks(); return t->nt.exitStatus; }