Merge pull request #2345 from wwylele/no-zombie-thread

Thread: remove the thread from the thread list when exiting
master
bunnei 2016-12-17 14:34:48 +07:00 committed by GitHub
commit 20b832cfc1
3 changed files with 15 additions and 3 deletions

@ -46,7 +46,7 @@ static std::vector<SharedPtr<Thread>> thread_list;
// Lists only ready thread ids. // Lists only ready thread ids.
static Common::ThreadQueueList<Thread*, THREADPRIO_LOWEST + 1> ready_queue; static Common::ThreadQueueList<Thread*, THREADPRIO_LOWEST + 1> ready_queue;
static Thread* current_thread; static SharedPtr<Thread> current_thread;
// The first available thread id at startup // The first available thread id at startup
static u32 next_thread_id; static u32 next_thread_id;
@ -63,7 +63,7 @@ Thread::Thread() {}
Thread::~Thread() {} Thread::~Thread() {}
Thread* GetCurrentThread() { Thread* GetCurrentThread() {
return current_thread; return current_thread.get();
} }
/** /**
@ -263,6 +263,13 @@ void WaitCurrentThread_ArbitrateAddress(VAddr wait_address) {
thread->status = THREADSTATUS_WAIT_ARB; thread->status = THREADSTATUS_WAIT_ARB;
} }
void ExitCurrentThread() {
Thread* thread = GetCurrentThread();
thread->Stop();
thread_list.erase(std::remove(thread_list.begin(), thread_list.end(), thread),
thread_list.end());
}
/** /**
* Callback that will wake up the thread it was scheduled for * Callback that will wake up the thread it was scheduled for
* @param thread_handle The handle of the thread that's been awoken * @param thread_handle The handle of the thread that's been awoken

@ -252,6 +252,11 @@ void WaitCurrentThread_WaitSynchronization(std::vector<SharedPtr<WaitObject>> wa
*/ */
void WaitCurrentThread_ArbitrateAddress(VAddr wait_address); void WaitCurrentThread_ArbitrateAddress(VAddr wait_address);
/**
* Stops the current thread and removes it from the thread_list
*/
void ExitCurrentThread();
/** /**
* Initialize threading * Initialize threading
*/ */

@ -584,7 +584,7 @@ static ResultCode CreateThread(Handle* out_handle, s32 priority, u32 entry_point
static void ExitThread() { static void ExitThread() {
LOG_TRACE(Kernel_SVC, "called, pc=0x%08X", Core::g_app_core->GetPC()); LOG_TRACE(Kernel_SVC, "called, pc=0x%08X", Core::g_app_core->GetPC());
Kernel::GetCurrentThread()->Stop(); Kernel::ExitCurrentThread();
} }
/// Gets the priority for the specified thread /// Gets the priority for the specified thread