summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2021-11-01 20:11:30 -0700
committerGravatar GitHub2021-11-01 20:11:30 -0700
commitb118fa8698dbe0e2b6e663c1c37a7eac03422905 (patch)
tree14864116c00d385abba61ad2330c1c0f50e4b961 /src/core/hle/kernel/kernel.cpp
parentMerge pull request #7264 from zhaobot/tx-update-20211101021628 (diff)
parentFix dangling kernel objects when exiting (diff)
downloadyuzu-b118fa8698dbe0e2b6e663c1c37a7eac03422905.tar.gz
yuzu-b118fa8698dbe0e2b6e663c1c37a7eac03422905.tar.xz
yuzu-b118fa8698dbe0e2b6e663c1c37a7eac03422905.zip
Merge pull request #7227 from vonchenplus/fix_memory_leak_v2
Fix memory leak v2
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp36
1 files changed, 30 insertions, 6 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp
index bea945301..4a139c5e7 100644
--- a/src/core/hle/kernel/kernel.cpp
+++ b/src/core/hle/kernel/kernel.cpp
@@ -91,12 +91,6 @@ struct KernelCore::Impl {
91 } 91 }
92 92
93 void Shutdown() { 93 void Shutdown() {
94 // Shutdown all processes.
95 if (current_process) {
96 current_process->Finalize();
97 current_process->Close();
98 current_process = nullptr;
99 }
100 process_list.clear(); 94 process_list.clear();
101 95
102 // Close all open server ports. 96 // Close all open server ports.
@@ -170,6 +164,24 @@ struct KernelCore::Impl {
170 // Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others 164 // Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others
171 next_host_thread_id = Core::Hardware::NUM_CPU_CORES; 165 next_host_thread_id = Core::Hardware::NUM_CPU_CORES;
172 166
167 // Close kernel objects that were not freed on shutdown
168 {
169 std::lock_guard lk(registered_in_use_objects_lock);
170 if (registered_in_use_objects.size()) {
171 for (auto& object : registered_in_use_objects) {
172 object->Close();
173 }
174 registered_in_use_objects.clear();
175 }
176 }
177
178 // Shutdown all processes.
179 if (current_process) {
180 current_process->Finalize();
181 current_process->Close();
182 current_process = nullptr;
183 }
184
173 // Track kernel objects that were not freed on shutdown 185 // Track kernel objects that were not freed on shutdown
174 { 186 {
175 std::lock_guard lk(registered_objects_lock); 187 std::lock_guard lk(registered_objects_lock);
@@ -714,9 +726,11 @@ struct KernelCore::Impl {
714 std::unordered_set<KServerPort*> server_ports; 726 std::unordered_set<KServerPort*> server_ports;
715 std::unordered_set<KServerSession*> server_sessions; 727 std::unordered_set<KServerSession*> server_sessions;
716 std::unordered_set<KAutoObject*> registered_objects; 728 std::unordered_set<KAutoObject*> registered_objects;
729 std::unordered_set<KAutoObject*> registered_in_use_objects;
717 std::mutex server_ports_lock; 730 std::mutex server_ports_lock;
718 std::mutex server_sessions_lock; 731 std::mutex server_sessions_lock;
719 std::mutex registered_objects_lock; 732 std::mutex registered_objects_lock;
733 std::mutex registered_in_use_objects_lock;
720 734
721 std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; 735 std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor;
722 std::vector<Kernel::PhysicalCore> cores; 736 std::vector<Kernel::PhysicalCore> cores;
@@ -928,6 +942,16 @@ void KernelCore::UnregisterKernelObject(KAutoObject* object) {
928 impl->registered_objects.erase(object); 942 impl->registered_objects.erase(object);
929} 943}
930 944
945void KernelCore::RegisterInUseObject(KAutoObject* object) {
946 std::lock_guard lk(impl->registered_in_use_objects_lock);
947 impl->registered_in_use_objects.insert(object);
948}
949
950void KernelCore::UnregisterInUseObject(KAutoObject* object) {
951 std::lock_guard lk(impl->registered_in_use_objects_lock);
952 impl->registered_in_use_objects.erase(object);
953}
954
931bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { 955bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
932 return port != impl->named_ports.cend(); 956 return port != impl->named_ports.cend();
933} 957}