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

hle: kernel: process: Add state lock.

bunnei 5 лет назад
Родитель
Сommit
3856564727
3 измененных файлов с 15 добавлено и 6 удалено
  1. 2 2
      src/core/hle/kernel/process.cpp
  2. 6 0
      src/core/hle/kernel/process.h
  3. 7 4
      src/core/hle/kernel/svc.cpp

+ 2 - 2
src/core/hle/kernel/process.cpp

@@ -138,7 +138,7 @@ std::shared_ptr<ResourceLimit> Process::GetResourceLimit() const {
 
 void Process::IncrementThreadCount() {
     ASSERT(num_threads >= 0);
-    ++num_created_threads;
+    num_created_threads++;
 
     if (const auto count = ++num_threads; count > peak_num_threads) {
         peak_num_threads = count;
@@ -443,7 +443,7 @@ bool Process::IsSignaled() const {
 Process::Process(Core::System& system)
     : KSynchronizationObject{system.Kernel()},
       page_table{std::make_unique<Memory::PageTable>(system)}, handle_table{system.Kernel()},
-      address_arbiter{system}, condition_var{system}, system{system} {}
+      address_arbiter{system}, condition_var{system}, state_lock{system.Kernel()}, system{system} {}
 
 Process::~Process() = default;
 

+ 6 - 0
src/core/hle/kernel/process.h

@@ -348,6 +348,10 @@ public:
     void PinCurrentThread();
     void UnpinCurrentThread();
 
+    KLightLock& GetStateLock() {
+        return state_lock;
+    }
+
     ///////////////////////////////////////////////////////////////////////////////////////////////
     // Thread-local storage management
 
@@ -472,6 +476,8 @@ private:
 
     KThread* exception_thread{};
 
+    KLightLock state_lock;
+
     /// System context
     Core::System& system;
 };

+ 7 - 4
src/core/hle/kernel/svc.cpp

@@ -1450,11 +1450,14 @@ static ResultCode CreateThread(Core::System& system, Handle* out_handle, VAddr e
              Svc::ResultInvalidPriority);
     R_UNLESS(process.CheckThreadPriority(priority), Svc::ResultInvalidPriority);
 
-    ASSERT(kernel.CurrentProcess()->GetResourceLimit()->Reserve(ResourceType::Threads, 1));
+    ASSERT(process.GetResourceLimit()->Reserve(ResourceType::Threads, 1));
 
-    CASCADE_RESULT(std::shared_ptr<KThread> thread,
-                   KThread::Create(system, ThreadType::User, "", entry_point, priority, arg,
-                                   core_id, stack_bottom, &process));
+    std::shared_ptr<KThread> thread;
+    {
+        KScopedLightLock lk{process.GetStateLock()};
+        CASCADE_RESULT(thread, KThread::Create(system, ThreadType::User, "", entry_point, priority,
+                                               arg, core_id, stack_bottom, &process));
+    }
 
     const auto new_thread_handle = process.GetHandleTable().Create(thread);
     if (new_thread_handle.Failed()) {