From b8ca8a44aa82101c5f53fb060f661d9933035df4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 9 Feb 2013 14:27:16 -0800 Subject: [PATCH] Fix completely wrong thread status switching. Wow, kinda surprised this even worked... But now things that use sceKernelRotateThreadReadyQueue are broken again. --- Core/HLE/sceKernelThread.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 93e8f8b794..afb8dfd4f7 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -1182,10 +1182,6 @@ Thread *__KernelNextThread() { void __KernelReSchedule(const char *reason) { - // TODO: Not sure if this is correct? - if (__GetCurrentThread() && __GetCurrentThread()->isRunning()) - __KernelChangeReadyState(currentThread, true); - // cancel rescheduling when in interrupt or callback, otherwise everything will be fucked up if (__IsInInterrupt() || __KernelInCallback()) { @@ -1208,6 +1204,10 @@ void __KernelReSchedule(const char *reason) return; } + // TODO: Not sure if this is correct? Probably should remove. + if (__GetCurrentThread() && __GetCurrentThread()->isRunning()) + __KernelChangeReadyState(currentThread, true); + retry: Thread *nextThread = __KernelNextThread(); @@ -1439,6 +1439,8 @@ int sceKernelStartThread(SceUID threadToStartID, u32 argSize, u32 argBlockPtr) threadToStartID,argSize,argBlockPtr); __KernelResetThread(startThread); + if (currentThread) + __KernelChangeReadyState(currentThread, true); __KernelChangeReadyState(startThread, threadToStartID, true, true); u32 sp = startThread->context.r[MIPS_REG_SP]; @@ -1602,7 +1604,7 @@ u32 sceKernelResumeDispatchThread(u32 suspended) int sceKernelRotateThreadReadyQueue(int priority) { - DEBUG_LOG(HLE,"sceKernelRotateThreadReadyQueue : rescheduling"); + ERROR_LOG(HLE, "sceKernelRotateThreadReadyQueue(%x)", priority); // TODO: Does it try better-priority threads? Is 0 special? if (!threadReadyQueue[priority].empty()) @@ -2278,15 +2280,15 @@ void __KernelSwitchContext(Thread *target, const char *reason) oldName = cur->GetName(); if (cur->isRunning()) - { - __KernelChangeReadyState(cur, oldUID, false); - cur->nt.status = (cur->nt.status | THREADSTATUS_READY) & ~THREADSTATUS_RUNNING; - } + __KernelChangeReadyState(cur, oldUID, true); } currentThread = target->GetUID(); - if (target && target->isRunning()) - __KernelChangeReadyState(target, currentThread, true); + if (target) + { + __KernelChangeReadyState(target, currentThread, false); + target->nt.status = (target->nt.status | THREADSTATUS_RUNNING) & ~THREADSTATUS_READY; + } __KernelLoadContext(&target->context);