diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp index 1713f235a..f2fe5cbf8 100644 --- a/src/core/hle/kernel/thread.cpp +++ b/src/core/hle/kernel/thread.cpp @@ -35,7 +35,7 @@ ResultVal Thread::WaitSynchronization() { } // Lists all thread ids that aren't deleted/etc. -static std::vector thread_queue; +static std::vector thread_queue; // TODO(yuriks): Owned // Lists only ready thread ids. static Common::ThreadQueueList thread_ready_queue; @@ -158,9 +158,7 @@ Handle ArbitrateHighestPriorityThread(Handle arbiter, u32 address) { s32 priority = THREADPRIO_LOWEST; // Iterate through threads, find highest priority thread that is waiting to be arbitrated... - for (Handle handle : thread_queue) { - Thread* thread = g_handle_table.Get(handle); - + for (Thread* thread : thread_queue) { if (!CheckWaitType(thread, WAITTYPE_ARB, Kernel::g_handle_table.GetGeneric(arbiter), address)) continue; @@ -168,7 +166,7 @@ Handle ArbitrateHighestPriorityThread(Handle arbiter, u32 address) { continue; // TODO(yuriks): Thread handle will hang around forever. Should clean up. if(thread->current_priority <= priority) { - highest_priority_thread = handle; + highest_priority_thread = thread->GetHandle(); priority = thread->current_priority; } } @@ -186,9 +184,7 @@ Handle ArbitrateHighestPriorityThread(Handle arbiter, u32 address) { void ArbitrateAllThreads(Handle arbiter, u32 address) { // Iterate through threads, find highest priority thread that is waiting to be arbitrated... - for (Handle handle : thread_queue) { - Thread* thread = g_handle_table.Get(handle); - + for (Thread* thread : thread_queue) { if (CheckWaitType(thread, WAITTYPE_ARB, Kernel::g_handle_table.GetGeneric(arbiter), address)) thread->ResumeFromWait(); } @@ -272,10 +268,10 @@ void DebugThreadQueue() { return; } LOG_DEBUG(Kernel, "0x%02X 0x%08X (current)", thread->current_priority, GetCurrentThread()->GetHandle()); - for (Handle handle : thread_queue) { - s32 priority = thread_ready_queue.contains(handle); + for (Thread* t : thread_queue) { + s32 priority = thread_ready_queue.contains(t->GetHandle()); if (priority != -1) { - LOG_DEBUG(Kernel, "0x%02X 0x%08X", priority, handle); + LOG_DEBUG(Kernel, "0x%02X 0x%08X", priority, t->GetHandle()); } } } @@ -310,12 +306,13 @@ ResultVal Thread::Create(const char* name, u32 entry_point, s32 priorit Thread* thread = new Thread; // TODO(yuriks): Thread requires a handle to be inserted into the various scheduling queues for now. + // TODO(yuriks): Don't create handle ResultVal handle = Kernel::g_handle_table.Create(thread); // TODO(yuriks): Plug memory leak if (handle.Failed()) return handle.Code(); - thread_queue.push_back(*handle); + thread_queue.push_back(thread); thread_ready_queue.prepare(priority); thread->thread_id = next_thread_id++; @@ -398,8 +395,7 @@ void Reschedule() { } else { LOG_TRACE(Kernel, "cannot context switch from 0x%08X, no higher priority thread!", prev->GetHandle()); - for (Handle handle : thread_queue) { - Thread* thread = g_handle_table.Get(handle); + for (Thread* thread : thread_queue) { LOG_TRACE(Kernel, "\thandle=0x%08X prio=0x%02X, status=0x%08X wait_type=0x%08X wait_handle=0x%08X", thread->GetHandle(), thread->current_priority, thread->status, thread->wait_type, thread->wait_object->GetHandle()); }