mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-31 16:09:03 -05:00 
			
		
		
		
	Merge pull request #1901 from jschmer/ServiceLeak
Fix Service object leak on emulation stop
This commit is contained in:
		| @@ -97,29 +97,33 @@ ServiceFrameworkBase::ServiceFrameworkBase(const char* service_name, u32 max_ses | ||||
| ServiceFrameworkBase::~ServiceFrameworkBase() = default; | ||||
|  | ||||
| void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) { | ||||
|     ASSERT(port == nullptr); | ||||
|     port = service_manager.RegisterService(service_name, max_sessions).Unwrap(); | ||||
|     ASSERT(!port_installed); | ||||
|  | ||||
|     auto port = service_manager.RegisterService(service_name, max_sessions).Unwrap(); | ||||
|     port->SetHleHandler(shared_from_this()); | ||||
|     port_installed = true; | ||||
| } | ||||
|  | ||||
| void ServiceFrameworkBase::InstallAsNamedPort() { | ||||
|     ASSERT(port == nullptr); | ||||
|     ASSERT(!port_installed); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto [server_port, client_port] = | ||||
|         Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); | ||||
|     server_port->SetHleHandler(shared_from_this()); | ||||
|     kernel.AddNamedPort(service_name, std::move(client_port)); | ||||
|     port_installed = true; | ||||
| } | ||||
|  | ||||
| Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { | ||||
|     ASSERT(port == nullptr); | ||||
|     ASSERT(!port_installed); | ||||
|  | ||||
|     auto& kernel = Core::System::GetInstance().Kernel(); | ||||
|     auto [server_port, client_port] = | ||||
|         Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); | ||||
|     port = MakeResult(std::move(server_port)).Unwrap(); | ||||
|     auto port = MakeResult(std::move(server_port)).Unwrap(); | ||||
|     port->SetHleHandler(shared_from_this()); | ||||
|     port_installed = true; | ||||
|     return client_port; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -96,11 +96,9 @@ private: | ||||
|     /// Maximum number of concurrent sessions that this service can handle. | ||||
|     u32 max_sessions; | ||||
|  | ||||
|     /** | ||||
|      * Port where incoming connections will be received. Only created when InstallAsService() or | ||||
|      * InstallAsNamedPort() are called. | ||||
|      */ | ||||
|     Kernel::SharedPtr<Kernel::ServerPort> port; | ||||
|     /// Flag to store if a port was already create/installed to detect multiple install attempts, | ||||
|     /// which is not supported. | ||||
|     bool port_installed = false; | ||||
|  | ||||
|     /// Function used to safely up-cast pointers to the derived class before invoking a handler. | ||||
|     InvokerFn* handler_invoker; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bunnei
					bunnei