summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
-rw-r--r--src/core/hle/kernel/kernel.cpp23
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
944void 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
949void 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
931bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const { 954bool KernelCore::IsValidNamedPort(NamedPortTable::const_iterator port) const {
932 return port != impl->named_ports.cend(); 955 return port != impl->named_ports.cend();
933} 956}