summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/k_server_port.cpp5
-rw-r--r--src/core/hle/kernel/kernel.cpp35
-rw-r--r--src/core/hle/kernel/kernel.h8
-rw-r--r--src/core/hle/kernel/svc.cpp1
-rw-r--r--src/core/hle/service/service.cpp4
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
26bool KServerPort::IsLight() const { 24bool 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
71bool KServerPort::IsSignaled() const { 66bool 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
1008void KernelCore::RegisterServerObject(KAutoObject* server_object) {
1009 impl->RegisterServerObject(server_object);
1010}
1011
1012void KernelCore::UnregisterServerObject(KAutoObject* server_object) {
1013 impl->UnregisterServerObject(server_object);
1014}
1015
1016void KernelCore::RegisterKernelObject(KAutoObject* object) { 983void 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