From 3a7a686fa96fcc2e9d89f10a740818dc0d393a7e Mon Sep 17 00:00:00 2001 From: Weiyi Wang Date: Tue, 29 Jan 2019 11:18:51 -0500 Subject: [PATCH] Kernel/SharedMemory: make owner_process a raw pointer To break a circular reference formed by process->handle_table->shared_memory->process. Since SharedMemory uses its owner process in the destructor, which is not kept alive by SharedMemory any more, we need to make sure that the lifetime of process is longer than the shared memory. To partially resolve this, Process now explicitly releases shared memory first in its destructor. This is with the assumtion that there is no inter-process reference to shared memory on exit, which is not true when we introduce more multi-process emulation. A TODO is left there for this, as more RE needs to be done on how 3DS handles this situation --- src/core/hle/kernel/process.cpp | 6 ++++++ src/core/hle/kernel/shared_memory.h | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/hle/kernel/process.cpp b/src/core/hle/kernel/process.cpp index 7dd775550..b04af4664 100644 --- a/src/core/hle/kernel/process.cpp +++ b/src/core/hle/kernel/process.cpp @@ -407,6 +407,12 @@ Kernel::Process::Process(KernelSystem& kernel) kernel.memory.RegisterPageTable(&vm_manager.page_table); } Kernel::Process::~Process() { + // Release all objects this process owns first so that their potential destructor can do clean + // up with this process before further destruction. + // TODO(wwylele): explicitly destroy or invalidate objects this process owns (threads, shared + // memory etc.) even if they are still referenced by other processes. + handle_table.Clear(); + kernel.memory.UnregisterPageTable(&vm_manager.page_table); } diff --git a/src/core/hle/kernel/shared_memory.h b/src/core/hle/kernel/shared_memory.h index a97630d2e..afc0b3bb1 100644 --- a/src/core/hle/kernel/shared_memory.h +++ b/src/core/hle/kernel/shared_memory.h @@ -94,7 +94,7 @@ private: /// Permission restrictions applied to other processes mapping the block. MemoryPermission other_permissions{}; /// Process that created this shared memory block. - SharedPtr owner_process; + Process* owner_process; /// Address of shared memory block in the owner process if specified. VAddr base_address = 0; /// Name of shared memory object.