summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar bunnei2021-06-28 14:38:14 -0700
committerGravatar bunnei2021-07-20 18:54:55 -0700
commit929994132a4f39ca4ab2975caf47a2a99a19b518 (patch)
treeb4109845efdac23561d43b3f7ab9478a14532594 /src/core
parentMerge pull request #6649 from german77/toggle_sdl (diff)
downloadyuzu-929994132a4f39ca4ab2975caf47a2a99a19b518.tar.gz
yuzu-929994132a4f39ca4ab2975caf47a2a99a19b518.tar.xz
yuzu-929994132a4f39ca4ab2975caf47a2a99a19b518.zip
hle: kernel: Provide methods for tracking dangling kernel objects.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/kernel/k_auto_object.cpp9
-rw-r--r--src/core/hle/kernel/k_auto_object.h12
-rw-r--r--src/core/hle/kernel/kernel.cpp16
-rw-r--r--src/core/hle/kernel/kernel.h8
4 files changed, 43 insertions, 2 deletions
diff --git a/src/core/hle/kernel/k_auto_object.cpp b/src/core/hle/kernel/k_auto_object.cpp
index dbe237f09..c99a9ebb7 100644
--- a/src/core/hle/kernel/k_auto_object.cpp
+++ b/src/core/hle/kernel/k_auto_object.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "core/hle/kernel/k_auto_object.h" 5#include "core/hle/kernel/k_auto_object.h"
6#include "core/hle/kernel/kernel.h"
6 7
7namespace Kernel { 8namespace Kernel {
8 9
@@ -11,4 +12,12 @@ KAutoObject* KAutoObject::Create(KAutoObject* obj) {
11 return obj; 12 return obj;
12} 13}
13 14
15void KAutoObject::RegisterWithKernel() {
16 kernel.RegisterKernelObject(this);
17}
18
19void KAutoObject::UnregisterWithKernel() {
20 kernel.UnregisterKernelObject(this);
21}
22
14} // namespace Kernel 23} // namespace Kernel
diff --git a/src/core/hle/kernel/k_auto_object.h b/src/core/hle/kernel/k_auto_object.h
index 88a052f65..e4fcdbc67 100644
--- a/src/core/hle/kernel/k_auto_object.h
+++ b/src/core/hle/kernel/k_auto_object.h
@@ -85,8 +85,12 @@ private:
85 KERNEL_AUTOOBJECT_TRAITS(KAutoObject, KAutoObject); 85 KERNEL_AUTOOBJECT_TRAITS(KAutoObject, KAutoObject);
86 86
87public: 87public:
88 explicit KAutoObject(KernelCore& kernel_) : kernel(kernel_) {} 88 explicit KAutoObject(KernelCore& kernel_) : kernel(kernel_) {
89 virtual ~KAutoObject() = default; 89 RegisterWithKernel();
90 }
91 virtual ~KAutoObject() {
92 UnregisterWithKernel();
93 }
90 94
91 static KAutoObject* Create(KAutoObject* ptr); 95 static KAutoObject* Create(KAutoObject* ptr);
92 96
@@ -166,6 +170,10 @@ public:
166 } 170 }
167 } 171 }
168 172
173private:
174 void RegisterWithKernel();
175 void UnregisterWithKernel();
176
169protected: 177protected:
170 KernelCore& kernel; 178 KernelCore& kernel;
171 std::string name; 179 std::string name;
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index 64bd0c494..ee60072c2 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -142,6 +142,13 @@ struct KernelCore::Impl {
142 142
143 // Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others 143 // Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
144 next_host_thread_id = Core::Hardware::NUM_CPU_CORES; 144 next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
145
146 // Track kernel objects that were not freed on shutdown
147 if (registered_objects.size()) {
148 LOG_WARNING(Kernel, "{} kernel objects were dangling on shutdown!",
149 registered_objects.size());
150 registered_objects.clear();
151 }
145 } 152 }
146 153
147 void InitializePhysicalCores() { 154 void InitializePhysicalCores() {
@@ -656,6 +663,7 @@ struct KernelCore::Impl {
656 /// the ConnectToPort SVC. 663 /// the ConnectToPort SVC.
657 std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; 664 std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory;
658 NamedPortTable named_ports; 665 NamedPortTable named_ports;
666 std::unordered_set<KAutoObject*> registered_objects;
659 667
660 std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; 668 std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
661 std::vector<Kernel::PhysicalCore> cores; 669 std::vector<Kernel::PhysicalCore> cores;
@@ -852,6 +860,14 @@ KClientPort* KernelCore::CreateNamedServicePort(std::string name) {
852 return &search->second(impl->system.ServiceManager(), impl->system); 860 return &search->second(impl->system.ServiceManager(), impl->system);
853} 861}
854 862
863void KernelCore::RegisterKernelObject(KAutoObject* object) {
864 impl->registered_objects.insert(object);
865}
866
867void KernelCore::UnregisterKernelObject(KAutoObject* object) {
868 impl->registered_objects.erase(object);
869}
870
855bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { 871bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
856 return port != impl->named_ports.cend(); 872 return port != impl->named_ports.cend();
857} 873}
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h
index 2d01e1ae0..b669ca74e 100644
--- a/src/core/hle/kernel/kernel.h
+++ b/src/core/hle/kernel/kernel.h
@@ -185,6 +185,14 @@ public:
185 /// Opens a port to a service previously registered with RegisterNamedService. 185 /// Opens a port to a service previously registered with RegisterNamedService.
186 KClientPort* CreateNamedServicePort(std::string name); 186 KClientPort* CreateNamedServicePort(std::string name);
187 187
188 /// Registers all kernel objects with the global emulation state, this is purely for tracking
189 /// leaks after emulation has been shutdown.
190 void RegisterKernelObject(KAutoObject* object);
191
192 /// Unregisters a kernel object previously registered with RegisterKernelObject when it was
193 /// destroyed during the current emulation session.
194 void UnregisterKernelObject(KAutoObject* object);
195
188 /// Determines whether or not the given port is a valid named port. 196 /// Determines whether or not the given port is a valid named port.
189 bool IsValidNamedPort(NamedPortTable::const_iterator port) const; 197 bool IsValidNamedPort(NamedPortTable::const_iterator port) const;
190 198