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

Merge pull request #1890 from jschmer/master

Fix Process object leak on emulation stop
Mat M 7 лет назад
Родитель
Сommit
700075beb6
3 измененных файлов с 12 добавлено и 13 удалено
  1. 3 3
      src/core/hle/kernel/shared_memory.cpp
  2. 3 3
      src/core/hle/kernel/shared_memory.h
  3. 6 7
      src/core/hle/kernel/svc.cpp

+ 3 - 3
src/core/hle/kernel/shared_memory.cpp

@@ -17,13 +17,13 @@ namespace Kernel {
 SharedMemory::SharedMemory(KernelCore& kernel) : Object{kernel} {}
 SharedMemory::SharedMemory(KernelCore& kernel) : Object{kernel} {}
 SharedMemory::~SharedMemory() = default;
 SharedMemory::~SharedMemory() = default;
 
 
-SharedPtr<SharedMemory> SharedMemory::Create(KernelCore& kernel, SharedPtr<Process> owner_process,
-                                             u64 size, MemoryPermission permissions,
+SharedPtr<SharedMemory> SharedMemory::Create(KernelCore& kernel, Process* owner_process, u64 size,
+                                             MemoryPermission permissions,
                                              MemoryPermission other_permissions, VAddr address,
                                              MemoryPermission other_permissions, VAddr address,
                                              MemoryRegion region, std::string name) {
                                              MemoryRegion region, std::string name) {
     SharedPtr<SharedMemory> shared_memory(new SharedMemory(kernel));
     SharedPtr<SharedMemory> shared_memory(new SharedMemory(kernel));
 
 
-    shared_memory->owner_process = std::move(owner_process);
+    shared_memory->owner_process = owner_process;
     shared_memory->name = std::move(name);
     shared_memory->name = std::move(name);
     shared_memory->size = size;
     shared_memory->size = size;
     shared_memory->permissions = permissions;
     shared_memory->permissions = permissions;

+ 3 - 3
src/core/hle/kernel/shared_memory.h

@@ -45,8 +45,8 @@ public:
      * linear heap.
      * linear heap.
      * @param name Optional object name, used for debugging purposes.
      * @param name Optional object name, used for debugging purposes.
      */
      */
-    static SharedPtr<SharedMemory> Create(KernelCore& kernel, SharedPtr<Process> owner_process,
-                                          u64 size, MemoryPermission permissions,
+    static SharedPtr<SharedMemory> Create(KernelCore& kernel, Process* owner_process, u64 size,
+                                          MemoryPermission permissions,
                                           MemoryPermission other_permissions, VAddr address = 0,
                                           MemoryPermission other_permissions, VAddr address = 0,
                                           MemoryRegion region = MemoryRegion::BASE,
                                           MemoryRegion region = MemoryRegion::BASE,
                                           std::string name = "Unknown");
                                           std::string name = "Unknown");
@@ -139,7 +139,7 @@ private:
     /// Permission restrictions applied to other processes mapping the block.
     /// Permission restrictions applied to other processes mapping the block.
     MemoryPermission other_permissions{};
     MemoryPermission other_permissions{};
     /// Process that created this shared memory block.
     /// Process that created this shared memory block.
-    SharedPtr<Process> owner_process;
+    Process* owner_process;
     /// Address of shared memory block in the owner process if specified.
     /// Address of shared memory block in the owner process if specified.
     VAddr base_address = 0;
     VAddr base_address = 0;
     /// Name of shared memory object.
     /// Name of shared memory object.

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

@@ -1487,9 +1487,9 @@ static ResultCode CreateTransferMemory(Handle* handle, VAddr addr, u64 size, u32
     }
     }
 
 
     auto& kernel = Core::System::GetInstance().Kernel();
     auto& kernel = Core::System::GetInstance().Kernel();
-    auto& handle_table = Core::CurrentProcess()->GetHandleTable();
-    const auto shared_mem_handle = SharedMemory::Create(
-        kernel, handle_table.Get<Process>(CurrentProcess), size, perms, perms, addr);
+    auto process = kernel.CurrentProcess();
+    auto& handle_table = process->GetHandleTable();
+    const auto shared_mem_handle = SharedMemory::Create(kernel, process, size, perms, perms, addr);
 
 
     CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
     CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
     return RESULT_SUCCESS;
     return RESULT_SUCCESS;
@@ -1599,10 +1599,9 @@ static ResultCode CreateSharedMemory(Handle* handle, u64 size, u32 local_permiss
     }
     }
 
 
     auto& kernel = Core::System::GetInstance().Kernel();
     auto& kernel = Core::System::GetInstance().Kernel();
-    auto& handle_table = Core::CurrentProcess()->GetHandleTable();
-    auto shared_mem_handle =
-        SharedMemory::Create(kernel, handle_table.Get<Process>(KernelHandle::CurrentProcess), size,
-                             local_perms, remote_perms);
+    auto process = kernel.CurrentProcess();
+    auto& handle_table = process->GetHandleTable();
+    auto shared_mem_handle = SharedMemory::Create(kernel, process, size, local_perms, remote_perms);
 
 
     CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
     CASCADE_RESULT(*handle, handle_table.Create(shared_mem_handle));
     return RESULT_SUCCESS;
     return RESULT_SUCCESS;