Browse Source

Fix dangling kernel objects when exiting

Feng Chen 4 năm trước cách đây
mục cha
commit
dd29285e35
2 tập tin đã thay đổi với 13 bổ sung11 xóa
  1. 6 5
      src/core/hle/kernel/k_process.cpp
  2. 7 6
      src/core/hle/kernel/kernel.cpp

+ 6 - 5
src/core/hle/kernel/k_process.cpp

@@ -434,11 +434,6 @@ void KProcess::PrepareForTermination() {
 }
 
 void KProcess::Finalize() {
-    // Release memory to the resource limit.
-    if (resource_limit != nullptr) {
-        resource_limit->Close();
-    }
-
     // Finalize the handle table and close any open handles.
     handle_table.Finalize();
 
@@ -460,6 +455,12 @@ void KProcess::Finalize() {
         }
     }
 
+    // Release memory to the resource limit.
+    if (resource_limit != nullptr) {
+        resource_limit->Close();
+        resource_limit = nullptr;
+    }
+
     // Perform inherited finalization.
     KAutoObjectWithSlabHeapAndContainer<KProcess, KSynchronizationObject>::Finalize();
 }

+ 7 - 6
src/core/hle/kernel/kernel.cpp

@@ -91,12 +91,6 @@ struct KernelCore::Impl {
     }
 
     void Shutdown() {
-        // Shutdown all processes.
-        if (current_process) {
-            current_process->Finalize();
-            current_process->Close();
-            current_process = nullptr;
-        }
         process_list.clear();
 
         // Close all open server ports.
@@ -181,6 +175,13 @@ struct KernelCore::Impl {
             }
         }
 
+        // Shutdown all processes.
+        if (current_process) {
+            current_process->Finalize();
+            current_process->Close();
+            current_process = nullptr;
+        }
+
         // Track kernel objects that were not freed on shutdown
         {
             std::lock_guard lk(registered_objects_lock);