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.
This commit is contained in:
parent
f45bddf9b6
commit
1a38f6fa7d
1 changed files with 22 additions and 2 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue