From 3f17fe71334a27a60bf54adc55eabe2356ed31f5 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 6 Sep 2018 20:34:51 -0400 Subject: core: Migrate current_process pointer to the kernel Given we now have the kernel as a class, it doesn't make sense to keep the current process pointer within the System class, as processes are related to the kernel. This also gets rid of a subtle case where memory wouldn't be freed on core shutdown, as the current_process pointer would never be reset, causing the pointed to contents to continue to live. --- src/core/core.cpp | 11 +++++++---- src/core/core.h | 5 ++++- src/core/hle/kernel/kernel.cpp | 14 ++++++++++++++ src/core/hle/kernel/kernel.h | 9 +++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index bf39ad689..713ee17c1 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -136,7 +136,7 @@ struct System::Impl { if (virtual_filesystem == nullptr) virtual_filesystem = std::make_shared(); - current_process = Kernel::Process::Create(kernel, "main"); + kernel.MakeCurrentProcess(Kernel::Process::Create(kernel, "main")); cpu_barrier = std::make_shared(); cpu_exclusive_monitor = Cpu::MakeExclusiveMonitor(cpu_cores.size()); @@ -202,7 +202,7 @@ struct System::Impl { return init_result; } - const Loader::ResultStatus load_result{app_loader->Load(current_process)}; + const Loader::ResultStatus load_result{app_loader->Load(kernel.CurrentProcess())}; if (load_result != Loader::ResultStatus::Success) { LOG_CRITICAL(Core, "Failed to load ROM (Error {})!", static_cast(load_result)); Shutdown(); @@ -281,7 +281,6 @@ struct System::Impl { std::unique_ptr renderer; std::unique_ptr gpu_core; std::shared_ptr debug_context; - Kernel::SharedPtr current_process; std::shared_ptr cpu_exclusive_monitor; std::shared_ptr cpu_barrier; std::array, NUM_CPU_CORES> cpu_cores; @@ -363,7 +362,11 @@ const std::shared_ptr& System::Scheduler(size_t core_index) { } Kernel::SharedPtr& System::CurrentProcess() { - return impl->current_process; + return impl->kernel.CurrentProcess(); +} + +const Kernel::SharedPtr& System::CurrentProcess() const { + return impl->kernel.CurrentProcess(); } ARM_Interface& System::ArmInterface(size_t core_index) { diff --git a/src/core/core.h b/src/core/core.h index 5c3c0e2a1..ab3663427 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -174,9 +174,12 @@ public: /// Gets the scheduler for the CPU core with the specified index const std::shared_ptr& Scheduler(size_t core_index); - /// Gets the current process + /// Provides a reference to the current process Kernel::SharedPtr& CurrentProcess(); + /// Provides a constant reference to the current process. + const Kernel::SharedPtr& CurrentProcess() const; + /// Provides a reference to the kernel instance. Kernel::KernelCore& Kernel(); diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 7902c2882..3e0800a71 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp @@ -116,6 +116,7 @@ struct KernelCore::Impl { next_thread_id = 1; process_list.clear(); + current_process.reset(); handle_table.Clear(); resource_limits.fill(nullptr); @@ -206,6 +207,7 @@ struct KernelCore::Impl { // Lists all processes that exist in the current session. std::vector> process_list; + SharedPtr current_process; Kernel::HandleTable handle_table; std::array, 4> resource_limits; @@ -264,6 +266,18 @@ void KernelCore::AppendNewProcess(SharedPtr process) { impl->process_list.push_back(std::move(process)); } +void KernelCore::MakeCurrentProcess(SharedPtr process) { + impl->current_process = std::move(process); +} + +SharedPtr& KernelCore::CurrentProcess() { + return impl->current_process; +} + +const SharedPtr& KernelCore::CurrentProcess() const { + return impl->current_process; +} + void KernelCore::AddNamedPort(std::string name, SharedPtr port) { impl->named_ports.emplace(std::move(name), std::move(port)); } diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index ab2e9bffa..c0771ecf0 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -65,6 +65,15 @@ public: /// Adds the given shared pointer to an internal list of active processes. void AppendNewProcess(SharedPtr process); + /// Makes the given process the new current process. + void MakeCurrentProcess(SharedPtr process); + + /// Retrieves a reference to the current process. + SharedPtr& CurrentProcess(); + + /// Retrieves a const reference to the current process. + const SharedPtr& CurrentProcess() const; + /// Adds a port to the named port table void AddNamedPort(std::string name, SharedPtr port); -- cgit v1.2.3