diff options
Diffstat (limited to 'src/core/hle/kernel/kernel.cpp')
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 134a0b8e9..cc6ee0eae 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -96,15 +96,15 @@ struct KernelCore::Impl { | |||
| 96 | 96 | ||
| 97 | process_list.clear(); | 97 | process_list.clear(); |
| 98 | 98 | ||
| 99 | // Close all open server ports. | 99 | // Close all open server sessions and ports. |
| 100 | std::unordered_set<KServerPort*> server_ports_; | 100 | std::unordered_set<KAutoObject*> server_objects_; |
| 101 | { | 101 | { |
| 102 | std::scoped_lock lk{server_ports_lock}; | 102 | std::scoped_lock lk(server_objects_lock); |
| 103 | server_ports_ = server_ports; | 103 | server_objects_ = server_objects; |
| 104 | server_ports.clear(); | 104 | server_objects.clear(); |
| 105 | } | 105 | } |
| 106 | for (auto* server_port : server_ports_) { | 106 | for (auto* server_object : server_objects_) { |
| 107 | server_port->Close(); | 107 | server_object->Close(); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | // Ensures all service threads gracefully shutdown. | 110 | // Ensures all service threads gracefully shutdown. |
| @@ -659,13 +659,20 @@ struct KernelCore::Impl { | |||
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | KClientPort* port = &search->second(system.ServiceManager(), system); | 661 | KClientPort* port = &search->second(system.ServiceManager(), system); |
| 662 | { | 662 | RegisterServerObject(&port->GetParent()->GetServerPort()); |
| 663 | std::scoped_lock lk{server_ports_lock}; | ||
| 664 | server_ports.insert(&port->GetParent()->GetServerPort()); | ||
| 665 | } | ||
| 666 | return port; | 663 | return port; |
| 667 | } | 664 | } |
| 668 | 665 | ||
| 666 | void RegisterServerObject(KAutoObject* server_object) { | ||
| 667 | std::scoped_lock lk(server_objects_lock); | ||
| 668 | server_objects.insert(server_object); | ||
| 669 | } | ||
| 670 | |||
| 671 | void UnregisterServerObject(KAutoObject* server_object) { | ||
| 672 | std::scoped_lock lk(server_objects_lock); | ||
| 673 | server_objects.erase(server_object); | ||
| 674 | } | ||
| 675 | |||
| 669 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, | 676 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, |
| 670 | const std::string& name) { | 677 | const std::string& name) { |
| 671 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); | 678 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, 1, name); |
| @@ -693,7 +700,7 @@ struct KernelCore::Impl { | |||
| 693 | service_threads_manager.QueueWork([this]() { service_threads.clear(); }); | 700 | service_threads_manager.QueueWork([this]() { service_threads.clear(); }); |
| 694 | } | 701 | } |
| 695 | 702 | ||
| 696 | std::mutex server_ports_lock; | 703 | std::mutex server_objects_lock; |
| 697 | std::mutex registered_objects_lock; | 704 | std::mutex registered_objects_lock; |
| 698 | std::mutex registered_in_use_objects_lock; | 705 | std::mutex registered_in_use_objects_lock; |
| 699 | 706 | ||
| @@ -723,7 +730,7 @@ struct KernelCore::Impl { | |||
| 723 | /// the ConnectToPort SVC. | 730 | /// the ConnectToPort SVC. |
| 724 | std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; | 731 | std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; |
| 725 | NamedPortTable named_ports; | 732 | NamedPortTable named_ports; |
| 726 | std::unordered_set<KServerPort*> server_ports; | 733 | std::unordered_set<KAutoObject*> server_objects; |
| 727 | std::unordered_set<KAutoObject*> registered_objects; | 734 | std::unordered_set<KAutoObject*> registered_objects; |
| 728 | std::unordered_set<KAutoObject*> registered_in_use_objects; | 735 | std::unordered_set<KAutoObject*> registered_in_use_objects; |
| 729 | 736 | ||
| @@ -928,6 +935,14 @@ KClientPort* KernelCore::CreateNamedServicePort(std::string name) { | |||
| 928 | return impl->CreateNamedServicePort(std::move(name)); | 935 | return impl->CreateNamedServicePort(std::move(name)); |
| 929 | } | 936 | } |
| 930 | 937 | ||
| 938 | void KernelCore::RegisterServerObject(KAutoObject* server_object) { | ||
| 939 | impl->RegisterServerObject(server_object); | ||
| 940 | } | ||
| 941 | |||
| 942 | void KernelCore::UnregisterServerObject(KAutoObject* server_object) { | ||
| 943 | impl->UnregisterServerObject(server_object); | ||
| 944 | } | ||
| 945 | |||
| 931 | void KernelCore::RegisterKernelObject(KAutoObject* object) { | 946 | void KernelCore::RegisterKernelObject(KAutoObject* object) { |
| 932 | std::scoped_lock lk{impl->registered_objects_lock}; | 947 | std::scoped_lock lk{impl->registered_objects_lock}; |
| 933 | impl->registered_objects.insert(object); | 948 | impl->registered_objects.insert(object); |