From 1a38f6fa7d9b2fe1ef117da5e68a0c7ad342e723 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 9 Jan 2014 22:04:29 -0800 Subject: [PATCH] Properly remove terminated thread from ready queue. If we change the priority first, we'll remove from the wrong priority level, oops. Gotta change afterward. Should improve Darkstalkers Chronicle: The Chaos Tower. --- Core/HLE/sceKernelThread.cpp | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 8b69a58743..9ab3e87ec2 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -631,6 +631,25 @@ struct ThreadQueueList } } + // Only for debugging, returns priority level. + int contains(const SceUID uid) + { + for (int i = 0; i < NUM_QUEUES; ++i) + { + if (queues[i].data == NULL) + continue; + + Queue *cur = &queues[i]; + for (int j = cur->first; j < cur->end; ++j) + { + if (cur->data[j] == uid) + return i; + } + } + + return -1; + } + inline SceUID pop_first() { Queue *cur = first; @@ -2423,11 +2442,12 @@ int sceKernelTerminateThread(SceUID threadID) } INFO_LOG(SCEKERNEL, "sceKernelTerminateThread(%i)", threadID); - // On terminate, we reset the thread priority. On exit, we don't always (see __KernelResetThread.) - t->nt.currentPriority = t->nt.initialPriority; // TODO: Should this reschedule? Seems like not. __KernelStopThread(threadID, SCE_KERNEL_ERROR_THREAD_TERMINATED, "thread terminated"); + // On terminate, we reset the thread priority. On exit, we don't always (see __KernelResetThread.) + t->nt.currentPriority = t->nt.initialPriority; + return 0; } else