From ef1d5cda06deac153582766fa9fc4074cb91f3d5 Mon Sep 17 00:00:00 2001
From: Subv <subv2112@gmail.com>
Date: Thu, 4 Dec 2014 08:13:53 -0500
Subject: [PATCH] Threads: Implemented a sequential thread id

---
 src/core/hle/kernel/thread.cpp | 16 +++++++++++++---
 src/core/hle/kernel/thread.h   |  7 ++++++-
 2 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/core/hle/kernel/thread.cpp b/src/core/hle/kernel/thread.cpp
index 6da238828d..ccb927381f 100644
--- a/src/core/hle/kernel/thread.cpp
+++ b/src/core/hle/kernel/thread.cpp
@@ -78,6 +78,17 @@ static Common::ThreadQueueList<Handle> thread_ready_queue;
 static Handle current_thread_handle;
 static Thread* current_thread;
 
+static const u32 INITIAL_THREAD_ID = 1; ///< The first available thread id at startup
+static u32 next_thread_id; ///< The next available thread id
+
+/**
+ * Gets the next available thread id and increments it
+ * @return Next available thread id
+ */
+static u32 NextThreadId() {
+    return next_thread_id++;
+}
+
 /// Gets the current thread
 inline Thread* GetCurrentThread() {
     return current_thread;
@@ -327,9 +338,7 @@ Thread* CreateThread(Handle& handle, const char* name, u32 entry_point, s32 prio
     thread_queue.push_back(handle);
     thread_ready_queue.prepare(priority);
 
-    // TODO(Subv): Assign valid ids to each thread, they are much lower than handle values
-    // they appear to begin at 276 and continue from there
-    thread->thread_id = handle; 
+    thread->thread_id = NextThreadId();
     thread->status = THREADSTATUS_DORMANT;
     thread->entry_point = entry_point;
     thread->stack_top = stack_top;
@@ -484,6 +493,7 @@ ResultCode GetThreadId(u32* thread_id, Handle handle) {
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 void ThreadingInit() {
+    next_thread_id = INITIAL_THREAD_ID;
 }
 
 void ThreadingShutdown() {
diff --git a/src/core/hle/kernel/thread.h b/src/core/hle/kernel/thread.h
index e87867ac03..53a19d7791 100644
--- a/src/core/hle/kernel/thread.h
+++ b/src/core/hle/kernel/thread.h
@@ -58,7 +58,12 @@ void Reschedule();
 /// Stops the current thread
 ResultCode StopThread(Handle thread, const char* reason);
 
-// Retrieves the thread id of the specified thread handle
+/**
+ * Retrieves the ID of the specified thread handle
+ * @param thread_id Will contain the output thread id
+ * @param handle Handle to the thread we want
+ * @return Whether the function was successful or not
+ */
 ResultCode GetThreadId(u32* thread_id, Handle handle);
 
 /// Resumes a thread from waiting by marking it as "ready"