diff options
| -rw-r--r-- | src/core/core.cpp | 15 |
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 | ||
| 86 | void KProcessDeleter(Kernel::KProcess* process) { | ||
| 87 | process->Destroy(); | ||
| 88 | } | ||
| 89 | |||
| 90 | using KProcessPtr = std::unique_ptr<Kernel::KProcess, decltype(&KProcessDeleter)>; | ||
| 91 | |||
| 86 | } // Anonymous namespace | 92 | } // Anonymous namespace |
| 87 | 93 | ||
| 88 | FileSys::VirtualFile GetGameFileFromPath(const FileSys::VirtualFilesystem& vfs, | 94 | FileSys::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{}; |