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

Merge pull request #316 from yuriks/thread-handle

Kernel: Implement support for current thread pseudo-handle
bunnei 11 лет назад
Родитель
Сommit
2e5869c939
3 измененных файлов с 16 добавлено и 2 удалено
  1. 12 0
      src/core/hle/kernel/kernel.h
  2. 1 2
      src/core/hle/kernel/thread.cpp
  3. 3 0
      src/core/hle/kernel/thread.h

+ 12 - 0
src/core/hle/kernel/kernel.h

@@ -14,6 +14,10 @@ typedef s32 Result;
 
 namespace Kernel {
 
+// From kernel.h. Declarations duplicated here to avoid a circular header dependency.
+class Thread;
+Thread* GetCurrentThread();
+
 enum KernelHandle {
     CurrentThread   = 0xFFFF8000,
     CurrentProcess  = 0xFFFF8001,
@@ -81,6 +85,10 @@ public:
 
     template <class T>
     T* Get(Handle handle) {
+        if (handle == CurrentThread) {
+            return reinterpret_cast<T*>(GetCurrentThread());
+        }
+
         if (handle < HANDLE_OFFSET || handle >= HANDLE_OFFSET + MAX_COUNT || !occupied[handle - HANDLE_OFFSET]) {
             if (handle != 0) {
                 LOG_ERROR(Kernel, "Bad object handle %08x", handle);
@@ -99,6 +107,10 @@ public:
     // ONLY use this when you know the handle is valid.
     template <class T>
     T *GetFast(Handle handle) {
+        if (handle == CurrentThread) {
+            return reinterpret_cast<T*>(GetCurrentThread());
+        }
+
         const Handle realHandle = handle - HANDLE_OFFSET;
         _dbg_assert_(Kernel, realHandle >= 0 && realHandle < MAX_COUNT && occupied[realHandle]);
         return static_cast<T*>(pool[realHandle]);

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

@@ -83,8 +83,7 @@ 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 current thread
-inline Thread* GetCurrentThread() {
+Thread* GetCurrentThread() {
     return current_thread;
 }
 

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

@@ -78,6 +78,9 @@ Handle ArbitrateHighestPriorityThread(u32 arbiter, u32 address);
 /// Arbitrate all threads currently waiting...
 void ArbitrateAllThreads(u32 arbiter, u32 address);
 
+/// Gets the current thread
+Thread* GetCurrentThread();
+
 /// Gets the current thread handle
 Handle GetCurrentThreadHandle();