diff options
| author | 2021-06-28 14:38:14 -0700 | |
|---|---|---|
| committer | 2021-07-20 18:54:55 -0700 | |
| commit | 929994132a4f39ca4ab2975caf47a2a99a19b518 (patch) | |
| tree | b4109845efdac23561d43b3f7ab9478a14532594 /src/core | |
| parent | Merge pull request #6649 from german77/toggle_sdl (diff) | |
| download | yuzu-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.cpp | 9 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_auto_object.h | 12 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 16 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 8 |
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 | ||
| 7 | namespace Kernel { | 8 | namespace Kernel { |
| 8 | 9 | ||
| @@ -11,4 +12,12 @@ KAutoObject* KAutoObject::Create(KAutoObject* obj) { | |||
| 11 | return obj; | 12 | return obj; |
| 12 | } | 13 | } |
| 13 | 14 | ||
| 15 | void KAutoObject::RegisterWithKernel() { | ||
| 16 | kernel.RegisterKernelObject(this); | ||
| 17 | } | ||
| 18 | |||
| 19 | void 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 | ||
| 87 | public: | 87 | public: |
| 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 | ||
| 173 | private: | ||
| 174 | void RegisterWithKernel(); | ||
| 175 | void UnregisterWithKernel(); | ||
| 176 | |||
| 169 | protected: | 177 | protected: |
| 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 | ||
| 863 | void KernelCore::RegisterKernelObject(KAutoObject* object) { | ||
| 864 | impl->registered_objects.insert(object); | ||
| 865 | } | ||
| 866 | |||
| 867 | void KernelCore::UnregisterKernelObject(KAutoObject* object) { | ||
| 868 | impl->registered_objects.erase(object); | ||
| 869 | } | ||
| 870 | |||
| 855 | bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { | 871 | bool 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 | ||