summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/service.cpp14
-rw-r--r--src/core/hle/service/service.h8
2 files changed, 12 insertions, 10 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
97ServiceFrameworkBase::~ServiceFrameworkBase() = default; 97ServiceFrameworkBase::~ServiceFrameworkBase() = default;
98 98
99void ServiceFrameworkBase::InstallAsService(SM::ServiceManager& service_manager) { 99void 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
105void ServiceFrameworkBase::InstallAsNamedPort() { 107void 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
115Kernel::SharedPtr<Kernel::ClientPort> ServiceFrameworkBase::CreatePort() { 118Kernel::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
diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h
index 98483ecf1..029533628 100644
--- a/src/core/hle/service/service.h
+++ b/src/core/hle/service/service.h
@@ -96,11 +96,9 @@ private:
96 /// Maximum number of concurrent sessions that this service can handle. 96 /// Maximum number of concurrent sessions that this service can handle.
97 u32 max_sessions; 97 u32 max_sessions;
98 98
99 /** 99 /// Flag to store if a port was already create/installed to detect multiple install attempts,
100 * Port where incoming connections will be received. Only created when InstallAsService() or 100 /// which is not supported.
101 * InstallAsNamedPort() are called. 101 bool port_installed = false;
102 */
103 Kernel::SharedPtr<Kernel::ServerPort> port;
104 102
105 /// Function used to safely up-cast pointers to the derived class before invoking a handler. 103 /// Function used to safely up-cast pointers to the derived class before invoking a handler.
106 InvokerFn* handler_invoker; 104 InvokerFn* handler_invoker;