diff options
| -rw-r--r-- | src/core/hle/kernel/k_server_port.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.cpp | 35 | ||||
| -rw-r--r-- | src/core/hle/kernel/kernel.h | 8 | ||||
| -rw-r--r-- | src/core/hle/kernel/svc.cpp | 1 | ||||
| -rw-r--r-- | src/core/hle/service/service.cpp | 4 |
5 files changed, 4 insertions, 49 deletions
diff --git a/src/core/hle/kernel/k_server_port.cpp b/src/core/hle/kernel/k_server_port.cpp index 12e0c3ffb..16968ba97 100644 --- a/src/core/hle/kernel/k_server_port.cpp +++ b/src/core/hle/kernel/k_server_port.cpp | |||
| @@ -19,8 +19,6 @@ void KServerPort::Initialize(KPort* parent_port_, std::string&& name_) { | |||
| 19 | // Set member variables. | 19 | // Set member variables. |
| 20 | parent = parent_port_; | 20 | parent = parent_port_; |
| 21 | name = std::move(name_); | 21 | name = std::move(name_); |
| 22 | |||
| 23 | kernel.RegisterServerObject(this); | ||
| 24 | } | 22 | } |
| 25 | 23 | ||
| 26 | bool KServerPort::IsLight() const { | 24 | bool KServerPort::IsLight() const { |
| @@ -63,9 +61,6 @@ void KServerPort::Destroy() { | |||
| 63 | 61 | ||
| 64 | // Close our reference to our parent. | 62 | // Close our reference to our parent. |
| 65 | parent->Close(); | 63 | parent->Close(); |
| 66 | |||
| 67 | // Ensure that the global list tracking server objects does not hold on to a reference. | ||
| 68 | kernel.UnregisterServerObject(this); | ||
| 69 | } | 64 | } |
| 70 | 65 | ||
| 71 | bool KServerPort::IsSignaled() const { | 66 | bool KServerPort::IsSignaled() const { |
diff --git a/src/core/hle/kernel/kernel.cpp b/src/core/hle/kernel/kernel.cpp index 29e122dfd..054898638 100644 --- a/src/core/hle/kernel/kernel.cpp +++ b/src/core/hle/kernel/kernel.cpp | |||
| @@ -185,17 +185,6 @@ struct KernelCore::Impl { | |||
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | void CloseServices() { | 187 | void CloseServices() { |
| 188 | // Close all open server sessions and ports. | ||
| 189 | std::unordered_set<KAutoObject*> server_objects_; | ||
| 190 | { | ||
| 191 | std::scoped_lock lk(server_objects_lock); | ||
| 192 | server_objects_ = server_objects; | ||
| 193 | server_objects.clear(); | ||
| 194 | } | ||
| 195 | for (auto* server_object : server_objects_) { | ||
| 196 | server_object->Close(); | ||
| 197 | } | ||
| 198 | |||
| 199 | // Ensures all service threads gracefully shutdown. | 188 | // Ensures all service threads gracefully shutdown. |
| 200 | ClearServiceThreads(); | 189 | ClearServiceThreads(); |
| 201 | } | 190 | } |
| @@ -699,9 +688,7 @@ struct KernelCore::Impl { | |||
| 699 | return {}; | 688 | return {}; |
| 700 | } | 689 | } |
| 701 | 690 | ||
| 702 | KClientPort* port = &search->second(system.ServiceManager(), system); | 691 | return &search->second(system.ServiceManager(), system); |
| 703 | RegisterServerObject(&port->GetParent()->GetServerPort()); | ||
| 704 | return port; | ||
| 705 | } | 692 | } |
| 706 | 693 | ||
| 707 | void RegisterNamedServiceHandler(std::string name, KServerPort* server_port) { | 694 | void RegisterNamedServiceHandler(std::string name, KServerPort* server_port) { |
| @@ -713,16 +700,6 @@ struct KernelCore::Impl { | |||
| 713 | search->second(system.ServiceManager(), server_port); | 700 | search->second(system.ServiceManager(), server_port); |
| 714 | } | 701 | } |
| 715 | 702 | ||
| 716 | void RegisterServerObject(KAutoObject* server_object) { | ||
| 717 | std::scoped_lock lk(server_objects_lock); | ||
| 718 | server_objects.insert(server_object); | ||
| 719 | } | ||
| 720 | |||
| 721 | void UnregisterServerObject(KAutoObject* server_object) { | ||
| 722 | std::scoped_lock lk(server_objects_lock); | ||
| 723 | server_objects.erase(server_object); | ||
| 724 | } | ||
| 725 | |||
| 726 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, | 703 | std::weak_ptr<Kernel::ServiceThread> CreateServiceThread(KernelCore& kernel, |
| 727 | const std::string& name) { | 704 | const std::string& name) { |
| 728 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, name); | 705 | auto service_thread = std::make_shared<Kernel::ServiceThread>(kernel, name); |
| @@ -755,7 +732,6 @@ struct KernelCore::Impl { | |||
| 755 | service_thread_barrier.Sync(); | 732 | service_thread_barrier.Sync(); |
| 756 | } | 733 | } |
| 757 | 734 | ||
| 758 | std::mutex server_objects_lock; | ||
| 759 | std::mutex registered_objects_lock; | 735 | std::mutex registered_objects_lock; |
| 760 | std::mutex registered_in_use_objects_lock; | 736 | std::mutex registered_in_use_objects_lock; |
| 761 | 737 | ||
| @@ -786,7 +762,6 @@ struct KernelCore::Impl { | |||
| 786 | std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; | 762 | std::unordered_map<std::string, ServiceInterfaceFactory> service_interface_factory; |
| 787 | std::unordered_map<std::string, ServiceInterfaceHandlerFn> service_interface_handlers; | 763 | std::unordered_map<std::string, ServiceInterfaceHandlerFn> service_interface_handlers; |
| 788 | NamedPortTable named_ports; | 764 | NamedPortTable named_ports; |
| 789 | std::unordered_set<KAutoObject*> server_objects; | ||
| 790 | std::unordered_set<KAutoObject*> registered_objects; | 765 | std::unordered_set<KAutoObject*> registered_objects; |
| 791 | std::unordered_set<KAutoObject*> registered_in_use_objects; | 766 | std::unordered_set<KAutoObject*> registered_in_use_objects; |
| 792 | 767 | ||
| @@ -1005,14 +980,6 @@ void KernelCore::RegisterNamedServiceHandler(std::string name, KServerPort* serv | |||
| 1005 | impl->RegisterNamedServiceHandler(std::move(name), server_port); | 980 | impl->RegisterNamedServiceHandler(std::move(name), server_port); |
| 1006 | } | 981 | } |
| 1007 | 982 | ||
| 1008 | void KernelCore::RegisterServerObject(KAutoObject* server_object) { | ||
| 1009 | impl->RegisterServerObject(server_object); | ||
| 1010 | } | ||
| 1011 | |||
| 1012 | void KernelCore::UnregisterServerObject(KAutoObject* server_object) { | ||
| 1013 | impl->UnregisterServerObject(server_object); | ||
| 1014 | } | ||
| 1015 | |||
| 1016 | void KernelCore::RegisterKernelObject(KAutoObject* object) { | 983 | void KernelCore::RegisterKernelObject(KAutoObject* object) { |
| 1017 | std::scoped_lock lk{impl->registered_objects_lock}; | 984 | std::scoped_lock lk{impl->registered_objects_lock}; |
| 1018 | impl->registered_objects.insert(object); | 985 | impl->registered_objects.insert(object); |
diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 670f93ee3..4ae6b3923 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h | |||
| @@ -204,14 +204,6 @@ public: | |||
| 204 | /// Accepts a session on a port created by CreateNamedServicePort. | 204 | /// Accepts a session on a port created by CreateNamedServicePort. |
| 205 | void RegisterNamedServiceHandler(std::string name, KServerPort* server_port); | 205 | void RegisterNamedServiceHandler(std::string name, KServerPort* server_port); |
| 206 | 206 | ||
| 207 | /// Registers a server session or port with the gobal emulation state, to be freed on shutdown. | ||
| 208 | /// This is necessary because we do not emulate processes for HLE sessions and ports. | ||
| 209 | void RegisterServerObject(KAutoObject* server_object); | ||
| 210 | |||
| 211 | /// Unregisters a server session or port previously registered with RegisterServerSession when | ||
| 212 | /// it was destroyed during the current emulation session. | ||
| 213 | void UnregisterServerObject(KAutoObject* server_object); | ||
| 214 | |||
| 215 | /// Registers all kernel objects with the global emulation state, this is purely for tracking | 207 | /// Registers all kernel objects with the global emulation state, this is purely for tracking |
| 216 | /// leaks after emulation has been shutdown. | 208 | /// leaks after emulation has been shutdown. |
| 217 | void RegisterKernelObject(KAutoObject* object); | 209 | void RegisterKernelObject(KAutoObject* object); |
diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index 8d2c7d6b7..4c819f4b6 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp | |||
| @@ -384,7 +384,6 @@ static Result ConnectToNamedPort(Core::System& system, Handle* out, VAddr port_n | |||
| 384 | // Create a session. | 384 | // Create a session. |
| 385 | KClientSession* session{}; | 385 | KClientSession* session{}; |
| 386 | R_TRY(port->CreateSession(std::addressof(session))); | 386 | R_TRY(port->CreateSession(std::addressof(session))); |
| 387 | port->Close(); | ||
| 388 | 387 | ||
| 389 | kernel.RegisterNamedServiceHandler(port_name, &port->GetParent()->GetServerPort()); | 388 | kernel.RegisterNamedServiceHandler(port_name, &port->GetParent()->GetServerPort()); |
| 390 | 389 | ||
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 0913a8065..6a64c6005 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -101,7 +101,9 @@ ServiceFrameworkBase::~ServiceFrameworkBase() { | |||
| 101 | const auto guard = LockService(); | 101 | const auto guard = LockService(); |
| 102 | 102 | ||
| 103 | if (named_port != nullptr) { | 103 | if (named_port != nullptr) { |
| 104 | named_port->Close(); | 104 | named_port->GetClientPort().Close(); |
| 105 | named_port->GetServerPort().Close(); | ||
| 106 | named_port = nullptr; | ||
| 105 | } | 107 | } |
| 106 | } | 108 | } |
| 107 | 109 | ||