diff options
| author | 2021-11-01 20:11:30 -0700 | |
|---|---|---|
| committer | 2021-11-01 20:11:30 -0700 | |
| commit | b118fa8698dbe0e2b6e663c1c37a7eac03422905 (patch) | |
| tree | 14864116c00d385abba61ad2330c1c0f50e4b961 /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #7264 from zhaobot/tx-update-20211101021628 (diff) | |
| parent | Fix dangling kernel objects when exiting (diff) | |
| download | yuzu-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.cpp | 36 |
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 | ||
| 945 | void 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 | |||
| 950 | void 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 | |||
| 931 | bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { | 955 | bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { |
| 932 | return port != impl->named_ports.cend(); | 956 | return port != impl->named_ports.cend(); |
| 933 | } | 957 | } |