Merge pull request #1901 from jschmer/ServiceLeak
Fix Service object leak on emulation stop
This commit is contained in:
		
						commit
						d1603a0abb
					
				@ -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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user