From a218dcc0f0d9b6df38d94145cfe9feb90d7fdd5f Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 9 Dec 2012 19:11:12 -0800 Subject: [PATCH] Ignore deleted callbacks early in the chain. This also ensures they won't prevent future callbacks from running. --- Core/HLE/sceKernelThread.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index d2814a5e5d..30eae26114 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1943,8 +1943,17 @@ bool __KernelCheckThreadCallbacks(Thread *thread, bool force) if (thread->readyCallbacks[i].size()) { SceUID readyCallback = thread->readyCallbacks[i].front(); thread->readyCallbacks[i].pop_front(); - __KernelRunCallbackOnThread(readyCallback, thread, !force); // makes pending - return true; + + // If the callback was deleted, we're good. Just skip it. + if (kernelObjects.IsValid(readyCallback)) + { + __KernelRunCallbackOnThread(readyCallback, thread, !force); // makes pending + return true; + } + else + { + WARN_LOG(HLE, "Ignoring deleted callback %08x", readyCallback); + } } } return false;