Просмотр исходного кода

Thread: remove the thread from the thread list when exiting

wwylele 9 лет назад
Родитель
Сommit
5728e42634
3 измененных файлов с 15 добавлено и 3 удалено
  1. 9 2
      src/core/hle/kernel/thread.cpp
  2. 5 0
      src/core/hle/kernel/thread.h
  3. 1 1
      src/core/hle/svc.cpp

+ 9 - 2
src/core/hle/kernel/thread.cpp

@@ -46,7 +46,7 @@ static std::vector<SharedPtr<Thread>> thread_list;
 // Lists only ready thread ids.
 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
 static u32 next_thread_id;
@@ -63,7 +63,7 @@ Thread::Thread() {}
 Thread::~Thread() {}
 
 Thread* GetCurrentThread() {
-    return current_thread;
+    return current_thread.get();
 }
 
 /**
@@ -263,6 +263,13 @@ void WaitCurrentThread_ArbitrateAddress(VAddr wait_address) {
     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
  * @param thread_handle The handle of the thread that's been awoken

+ 5 - 0
src/core/hle/kernel/thread.h

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

+ 1 - 1
src/core/hle/svc.cpp

@@ -584,7 +584,7 @@ static ResultCode CreateThread(Handle* out_handle, s32 priority, u32 entry_point
 static void ExitThread() {
     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