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

thread: Keep track of the initially created handle.

This is kinda crufty, but we need it for now to update guest state variables.
bunnei 8 лет назад
Родитель
Сommit
1cb978eb82
3 измененных файлов с 7 добавлено и 2 удалено
  1. 2 1
      src/core/hle/kernel/thread.cpp
  2. 3 0
      src/core/hle/kernel/thread.h
  3. 2 1
      src/core/hle/svc.cpp

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

@@ -502,7 +502,8 @@ SharedPtr<Thread> SetupMainThread(VAddr entry_point, u32 priority,
     SharedPtr<Thread> thread = std::move(thread_res).Unwrap();
 
     // Register 1 must be a handle to the main thread
-    thread->context.cpu_registers[1] = Kernel::g_handle_table.Create(thread).Unwrap();
+    thread->guest_handle = Kernel::g_handle_table.Create(thread).Unwrap();;
+    thread->context.cpu_registers[1] = thread->guest_handle;
     thread->context.fpscr =
         FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO | FPSCR_IXC; // 0x03C00010
 

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

@@ -212,6 +212,9 @@ public:
 
     std::string name;
 
+    /// Handle used by guest emulated application to access this thread
+    Handle guest_handle;
+
     /// Handle used as userdata to reference this object when inserting into the CoreTiming queue.
     Handle callback_handle;
 

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

@@ -268,7 +268,8 @@ static ResultCode CreateThread(Handle* out_handle, VAddr entry_point, u64 arg, V
     thread->context.fpscr =
         FPSCR_DEFAULT_NAN | FPSCR_FLUSH_TO_ZERO | FPSCR_ROUND_TOZERO; // 0x03C00000
 
-    CASCADE_RESULT(*out_handle, Kernel::g_handle_table.Create(std::move(thread)));
+    CASCADE_RESULT(thread->guest_handle, Kernel::g_handle_table.Create(thread));
+    *out_handle = thread->guest_handle;
 
     Core::System::GetInstance().PrepareReschedule();