diff options
| author | 2018-12-15 00:30:10 -0500 | |
|---|---|---|
| committer | 2018-12-15 00:30:10 -0500 | |
| commit | d1603a0abbff7ebeda0c68b728bcfe012ae6a58a (patch) | |
| tree | 34397e9e02f167436279de3cd1f566dd065270ec /src/core/hle/service/service.cpp | |
| parent | Merge pull request #1732 from DarkLordZach/yield-types (diff) | |
| parent | Fix Service object leak on emulation stop (diff) | |
| download | yuzu-d1603a0abbff7ebeda0c68b728bcfe012ae6a58a.tar.gz yuzu-d1603a0abbff7ebeda0c68b728bcfe012ae6a58a.tar.xz yuzu-d1603a0abbff7ebeda0c68b728bcfe012ae6a58a.zip | |
Merge pull request #1901 from jschmer/ServiceLeak
Fix Service object leak on emulation stop
Diffstat (limited to 'src/core/hle/service/service.cpp')
| -rw-r--r-- | src/core/hle/service/service.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index d41df3732..d25b80ab0 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -97,29 +97,33 @@ ServiceFrameworkBase::ServiceFrameworkBase(const char* service_name, u32 max_ses | |||
| 97 | ServiceFrameworkBase::~ServiceFrameworkBase() = default; | 97 | ServiceFrameworkBase::~ServiceFrameworkBase() = default; |
| 98 | 98 | ||
| 99 | void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) { | 99 | void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) { |
| 100 | ASSERT(port == nullptr); | 100 | ASSERT(!port_installed); |
| 101 | port = service_manager.RegisterService(service_name, max_sessions).Unwrap(); | 101 | |
| 102 | auto port = service_manager.RegisterService(service_name, max_sessions).Unwrap(); | ||
| 102 | port->SetHleHandler(shared_from_this()); | 103 | port->SetHleHandler(shared_from_this()); |
| 104 | port_installed = true; | ||
| 103 | } | 105 | } |
| 104 | 106 | ||
| 105 | void ServiceFrameworkBase::InstallAsNamedPort() { | 107 | void ServiceFrameworkBase::InstallAsNamedPort() { |
| 106 | ASSERT(port == nullptr); | 108 | ASSERT(!port_installed); |
| 107 | 109 | ||
| 108 | auto& kernel = Core::System::GetInstance().Kernel(); | 110 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 109 | auto [server_port, client_port] = | 111 | auto [server_port, client_port] = |
| 110 | Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); | 112 | Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); |
| 111 | server_port->SetHleHandler(shared_from_this()); | 113 | server_port->SetHleHandler(shared_from_this()); |
| 112 | kernel.AddNamedPort(service_name, std::move(client_port)); | 114 | kernel.AddNamedPort(service_name, std::move(client_port)); |
| 115 | port_installed = true; | ||
| 113 | } | 116 | } |
| 114 | 117 | ||
| 115 | Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { | 118 | Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { |
| 116 | ASSERT(port == nullptr); | 119 | ASSERT(!port_installed); |
| 117 | 120 | ||
| 118 | auto& kernel = Core::System::GetInstance().Kernel(); | 121 | auto& kernel = Core::System::GetInstance().Kernel(); |
| 119 | auto [server_port, client_port] = | 122 | auto [server_port, client_port] = |
| 120 | Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); | 123 | Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); |
| 121 | port = MakeResult(std::move(server_port)).Unwrap(); | 124 | auto port = MakeResult(std::move(server_port)).Unwrap(); |
| 122 | port->SetHleHandler(shared_from_this()); | 125 | port->SetHleHandler(shared_from_this()); |
| 126 | port_installed = true; | ||
| 123 | return client_port; | 127 | return client_port; |
| 124 | } | 128 | } |
| 125 | 129 | ||