mirror of
https://github.com/yuzu-mirror/yuzu.git
synced 2024-11-18 03:27:33 +01:00
Fix Process object leak on emulation stop
The Process object kept itself alive indefinitely because its handle_table contains a SharedMemory object which owns a reference to the same Process object, creating a circular ownership scenario. Break that up by storing only a non-owning pointer in the SharedMemory object.
This commit is contained in:
parent
9bae3ac33a
commit
ae390ad5a2
@ -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,
|
SharedPtr<SharedMemory> SharedMemory::Create(KernelCore& kernel, Process* owner_process, u64 size,
|
||||||
u64 size, MemoryPermission permissions,
|
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;
|
||||||
|
@ -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,
|
static SharedPtr<SharedMemory> Create(KernelCore& kernel, Process* owner_process, u64 size,
|
||||||
u64 size, MemoryPermission permissions,
|
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.
|
||||||
|
@ -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();
|
auto process = kernel.CurrentProcess();
|
||||||
const auto shared_mem_handle = SharedMemory::Create(
|
auto& handle_table = process->GetHandleTable();
|
||||||
kernel, handle_table.Get<Process>(CurrentProcess), size, perms, perms, addr);
|
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 process = kernel.CurrentProcess();
|
||||||
auto shared_mem_handle =
|
auto& handle_table = process->GetHandleTable();
|
||||||
SharedMemory::Create(kernel, handle_table.Get<Process>(KernelHandle::CurrentProcess), size,
|
auto shared_mem_handle = SharedMemory::Create(kernel, process, size, local_perms, remote_perms);
|
||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user