summaryrefslogtreecommitdiff
path: root/src/core/core.cpp
diff options
context:
space:
mode:
authorGravatar ameerj2021-09-13 20:57:42 -0400
committerGravatar ameerj2021-09-13 23:44:52 -0400
commit67f7a6c398b3884e4012d10ffde4480a28a73f12 (patch)
tree19537dccce569fdeed757be002f6aa8d422e410a /src/core/core.cpp
parentMerge pull request #7002 from ameerj/vk-state-unused (diff)
downloadyuzu-67f7a6c398b3884e4012d10ffde4480a28a73f12.tar.gz
yuzu-67f7a6c398b3884e4012d10ffde4480a28a73f12.tar.xz
yuzu-67f7a6c398b3884e4012d10ffde4480a28a73f12.zip
core: Destroy main_process during shutdown
The main_process was never being cleaned up, causing a noticeable memory leak after subsequent launches. This change cleans up the memory during Core Shutdown, mitigating the leak.
Diffstat (limited to 'src/core/core.cpp')
-rw-r--r--src/core/core.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/core/core.cpp b/src/core/core.cpp
index ba4629993..b13350f6e 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -83,6 +83,12 @@ FileSys::StorageId GetStorageIdForFrontendSlot(
83 } 83 }
84} 84}
85 85
86void KProcessDeleter(Kernel::KProcess* process) {
87 process->Destroy();
88}
89
90using KProcessPtr = std::unique_ptr<Kernel::KProcess, decltype(&KProcessDeleter)>;
91
86} // Anonymous namespace 92} // Anonymous namespace
87 93
88FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, 94FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs,
@@ -233,8 +239,8 @@ struct System::Impl {
233 } 239 }
234 240
235 telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider); 241 telemetry_session->AddInitialInfo(*app_loader, fs_controller, *content_provider);
236 auto main_process = Kernel::KProcess::Create(system.Kernel()); 242 main_process = KProcessPtr{Kernel::KProcess::Create(system.Kernel()), KProcessDeleter};
237 ASSERT(Kernel::KProcess::Initialize(main_process, system, "main", 243 ASSERT(Kernel::KProcess::Initialize(main_process.get(), system, "main",
238 Kernel::KProcess::ProcessType::Userland) 244 Kernel::KProcess::ProcessType::Userland)
239 .IsSuccess()); 245 .IsSuccess());
240 main_process->Open(); 246 main_process->Open();
@@ -247,7 +253,7 @@ struct System::Impl {
247 static_cast<u32>(load_result)); 253 static_cast<u32>(load_result));
248 } 254 }
249 AddGlueRegistrationForProcess(*app_loader, *main_process); 255 AddGlueRegistrationForProcess(*app_loader, *main_process);
250 kernel.MakeCurrentProcess(main_process); 256 kernel.MakeCurrentProcess(main_process.get());
251 kernel.InitializeCores(); 257 kernel.InitializeCores();
252 258
253 // Initialize cheat engine 259 // Initialize cheat engine
@@ -316,6 +322,8 @@ struct System::Impl {
316 kernel.Shutdown(); 322 kernel.Shutdown();
317 memory.Reset(); 323 memory.Reset();
318 applet_manager.ClearAll(); 324 applet_manager.ClearAll();
325 // TODO: The main process should be freed based on KAutoObject ref counting.
326 main_process.reset();
319 327
320 LOG_DEBUG(Core, "Shutdown OK"); 328 LOG_DEBUG(Core, "Shutdown OK");
321 } 329 }
@@ -374,6 +382,7 @@ struct System::Impl {
374 std::unique_ptr<Tegra::GPU> gpu_core; 382 std::unique_ptr<Tegra::GPU> gpu_core;
375 std::unique_ptr<Hardware::InterruptManager> interrupt_manager; 383 std::unique_ptr<Hardware::InterruptManager> interrupt_manager;
376 std::unique_ptr<Core::DeviceMemory> device_memory; 384 std::unique_ptr<Core::DeviceMemory> device_memory;
385 KProcessPtr main_process{nullptr, KProcessDeleter};
377 Core::Memory::Memory memory; 386 Core::Memory::Memory memory;
378 CpuManager cpu_manager; 387 CpuManager cpu_manager;
379 std::atomic_bool is_powered_on{}; 388 std::atomic_bool is_powered_on{};