diff options
| author | 2021-10-25 18:55:20 +0800 | |
|---|---|---|
| committer | 2021-10-27 09:06:22 +0800 | |
| commit | a8b01049235bffa13d18a010311c16c8b9c316b4 (patch) | |
| tree | 3e8f433c3da629b09a4b3e000047ceb6f8ac3ec0 /src/core/hle/kernel/kernel.cpp | |
| parent | Merge pull request #7218 from bylaws/aswdqdsam (diff) | |
| download | yuzu-a8b01049235bffa13d18a010311c16c8b9c316b4.tar.gz yuzu-a8b01049235bffa13d18a010311c16c8b9c316b4.tar.xz yuzu-a8b01049235bffa13d18a010311c16c8b9c316b4.zip | |
Fix memory leak
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index bea945301..d054a7925 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -170,6 +170,17 @@ struct KernelCore::Impl { | |||
| 170 | // Next host thead ID to use, 0-3 IDs represent core threads, >3 represent others | 170 | // 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; | 171 | next_host_thread_id = Core::Hardware::NUM_CPU_CORES; |
| 172 | 172 | ||
| 173 | // Close kernel objects that were not freed on shutdown | ||
| 174 | { | ||
| 175 | std::lock_guard lk(registered_in_use_objects_lock); | ||
| 176 | if (registered_in_use_objects.size()) { | ||
| 177 | for (auto thread : registered_in_use_objects) { | ||
| 178 | thread->Close(); | ||
| 179 | } | ||
| 180 | registered_in_use_objects.clear(); | ||
| 181 | } | ||
| 182 | } | ||
| 183 | |||
| 173 | // Track kernel objects that were not freed on shutdown | 184 | // Track kernel objects that were not freed on shutdown |
| 174 | { | 185 | { |
| 175 | std::lock_guard lk(registered_objects_lock); | 186 | std::lock_guard lk(registered_objects_lock); |
| @@ -714,9 +725,11 @@ struct KernelCore::Impl { | |||
| 714 | std::unordered_set<KServerPort*> server_ports; | 725 | std::unordered_set<KServerPort*> server_ports; |
| 715 | std::unordered_set<KServerSession*> server_sessions; | 726 | std::unordered_set<KServerSession*> server_sessions; |
| 716 | std::unordered_set<KAutoObject*> registered_objects; | 727 | std::unordered_set<KAutoObject*> registered_objects; |
| 728 | std::unordered_set<KAutoObject*> registered_in_use_objects; | ||
| 717 | std::mutex server_ports_lock; | 729 | std::mutex server_ports_lock; |
| 718 | std::mutex server_sessions_lock; | 730 | std::mutex server_sessions_lock; |
| 719 | std::mutex registered_objects_lock; | 731 | std::mutex registered_objects_lock; |
| 732 | std::mutex registered_in_use_objects_lock; | ||
| 720 | 733 | ||
| 721 | std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; | 734 | std::unique_ptr<Core::ExclusiveMonitor> exclusive_monitor; |
| 722 | std::vector<Kernel::PhysicalCore> cores; | 735 | std::vector<Kernel::PhysicalCore> cores; |
| @@ -928,6 +941,16 @@ void KernelCore::UnregisterKernelObject(KAutoObject* object) { | |||
| 928 | impl->registered_objects.erase(object); | 941 | impl->registered_objects.erase(object); |
| 929 | } | 942 | } |
| 930 | 943 | ||
| 944 | void KernelCore::RegisterInUseObject(KAutoObject* object) { | ||
| 945 | std::lock_guard lk(impl->registered_in_use_objects_lock); | ||
| 946 | impl->registered_in_use_objects.insert(object); | ||
| 947 | } | ||
| 948 | |||
| 949 | void KernelCore::UnregisterInUseObject(KAutoObject* object) { | ||
| 950 | std::lock_guard lk(impl->registered_in_use_objects_lock); | ||
| 951 | impl->registered_in_use_objects.erase(object); | ||
| 952 | } | ||
| 953 | |||
| 931 | bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { | 954 | bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { |
| 932 | return port != impl->named_ports.cend(); | 955 | return port != impl->named_ports.cend(); |
| 933 | } | 956 | } |