From 929994132a4f39ca4ab2975caf47a2a99a19b518 Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Mon, 28 Jun 2021 14:38:14 -0700
Subject: hle: kernel: Provide methods for tracking dangling kernel objects.

---
 src/core/hle/kernel/kernel.cpp | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

(limited to 'src/core/hle/kernel/kernel.cpp')

diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 64bd0c4945..ee60072c2f 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -142,6 +142,13 @@ struct KernelCore::Impl {
 
         // Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
         next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
+
+        // Track kernel objects that were not freed on shutdown
+        if (registered_objects.size()) {
+            LOG_WARNING(Kernel, "{} kernel objects were dangling on shutdown!",
+                        registered_objects.size());
+            registered_objects.clear();
+        }
     }
 
     void InitializePhysicalCores() {
@@ -656,6 +663,7 @@ struct KernelCore::Impl {
     /// the ConnectToPort SVC.
     std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory;
     NamedPortTable named_ports;
+    std::unordered_set<KAutoObject*> registered_objects;
 
     std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
     std::vector<Kernel::PhysicalCore> cores;
@@ -852,6 +860,14 @@ KClientPort* KernelCore::CreateNamedServicePort(std::string name) {
     return &search->second(impl->system.ServiceManager(), impl->system);
 }
 
+void KernelCore::RegisterKernelObject(KAutoObject* object) {
+    impl->registered_objects.insert(object);
+}
+
+void KernelCore::UnregisterKernelObject(KAutoObject* object) {
+    impl->registered_objects.erase(object);
+}
+
 bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
     return port != impl->named_ports.cend();
 }
-- 
cgit v1.2.3-70-g09d2