summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2017-06-06 08:04:02 -0700
committerGravatar GitHub2017-06-06 08:04:02 -0700
commitfc1bd06192a10b52425b76880531b520dd68e86d (patch)
treebe459930c35e50f698ef7747730092116eea6a74 /src
parentMerge pull request #2752 from yuriks/move-session-request-handler (diff)
parentKernel: Add a dedicated SetHleHandler method to ServerPort/ServerSession (diff)
downloadyuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.gz
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.tar.xz
yuzu-fc1bd06192a10b52425b76880531b520dd68e86d.zip
Merge pull request #2753 from yuriks/set-hle-handler
Add SetHleHandler to ServerPort/ServerSession
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/kernel/client_port.cpp11
-rw-r--r--src/core/hle/kernel/hle_ipc.cpp2
-rw-r--r--src/core/hle/kernel/hle_ipc.h3
-rw-r--r--src/core/hle/kernel/server_port.cpp3
-rw-r--r--src/core/hle/kernel/server_port.h14
-rw-r--r--src/core/hle/kernel/server_session.cpp16
-rw-r--r--src/core/hle/kernel/server_session.h20
-rw-r--r--src/core/hle/result.h19
-rw-r--r--src/core/hle/service/fs/archive.cpp11
-rw-r--r--src/core/hle/service/fs/archive.h2
-rw-r--r--src/core/hle/service/fs/fs_user.cpp33
-rw-r--r--src/core/hle/service/service.cpp20
12 files changed, 92 insertions, 62 deletions
diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp
index 45533ed45..ce5d94e99 100644
--- a/src/core/hle/kernel/client_port.cpp
+++ b/src/core/hle/kernel/client_port.cpp
@@ -26,20 +26,17 @@ ResultVal<SharedPtr<ClientSession>> ClientPort::Connect() {
26 active_sessions++; 26 active_sessions++;
27 27
28 // Create a new session pair, let the created sessions inherit the parent port's HLE handler. 28 // Create a new session pair, let the created sessions inherit the parent port's HLE handler.
29 auto sessions = 29 auto sessions = ServerSession::CreateSessionPair(server_port->GetName(), this);
30 ServerSession::CreateSessionPair(server_port->GetName(), server_port->hle_handler, this);
31 auto client_session = std::get<SharedPtr<ClientSession>>(sessions);
32 auto server_session = std::get<SharedPtr<ServerSession>>(sessions);
33 30
34 if (server_port->hle_handler) 31 if (server_port->hle_handler)
35 server_port->hle_handler->ClientConnected(server_session); 32 server_port->hle_handler->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
36 else 33 else
37 server_port->pending_sessions.push_back(std::move(server_session)); 34 server_port->pending_sessions.push_back(std::get<SharedPtr<ServerSession>>(sessions));
38 35
39 // Wake the threads waiting on the ServerPort 36 // Wake the threads waiting on the ServerPort
40 server_port->WakeupAllWaitingThreads(); 37 server_port->WakeupAllWaitingThreads();
41 38
42 return MakeResult<SharedPtr<ClientSession>>(std::move(client_session)); 39 return MakeResult(std::get<SharedPtr<ClientSession>>(sessions));
43} 40}
44 41
45} // namespace 42} // namespace
diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp
index 4886afa5c..0922b3f47 100644
--- a/src/core/hle/kernel/hle_ipc.cpp
+++ b/src/core/hle/kernel/hle_ipc.cpp
@@ -12,10 +12,12 @@
12namespace Kernel { 12namespace Kernel {
13 13
14void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) { 14void SessionRequestHandler::ClientConnected(SharedPtr<ServerSession> server_session) {
15 server_session->SetHleHandler(shared_from_this());
15 connected_sessions.push_back(server_session); 16 connected_sessions.push_back(server_session);
16} 17}
17 18
18void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) { 19void SessionRequestHandler::ClientDisconnected(SharedPtr<ServerSession> server_session) {
20 server_session->SetHleHandler(nullptr);
19 boost::range::remove_erase(connected_sessions, server_session); 21 boost::range::remove_erase(connected_sessions, server_session);
20} 22}
21 23
diff --git a/src/core/hle/kernel/hle_ipc.h b/src/core/hle/kernel/hle_ipc.h
index b3550734c..14f682f44 100644
--- a/src/core/hle/kernel/hle_ipc.h
+++ b/src/core/hle/kernel/hle_ipc.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <memory>
7#include <vector> 8#include <vector>
8#include "core/hle/kernel/kernel.h" 9#include "core/hle/kernel/kernel.h"
9 10
@@ -16,7 +17,7 @@ class ServerSession;
16 * This can be provided to a ServerSession in order to hook into several relevant events 17 * This can be provided to a ServerSession in order to hook into several relevant events
17 * (such as a new connection or a SyncRequest) so they can be implemented in the emulator. 18 * (such as a new connection or a SyncRequest) so they can be implemented in the emulator.
18 */ 19 */
19class SessionRequestHandler { 20class SessionRequestHandler : public std::enable_shared_from_this<SessionRequestHandler> {
20public: 21public:
21 /** 22 /**
22 * Handles a sync request from the emulated application. 23 * Handles a sync request from the emulated application.
diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp
index f6e0c7dbf..4d20c39a1 100644
--- a/src/core/hle/kernel/server_port.cpp
+++ b/src/core/hle/kernel/server_port.cpp
@@ -24,13 +24,12 @@ void ServerPort::Acquire(Thread* thread) {
24} 24}
25 25
26std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair( 26std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> ServerPort::CreatePortPair(
27 u32 max_sessions, std::string name, std::shared_ptr<SessionRequestHandler> hle_handler) { 27 u32 max_sessions, std::string name) {
28 28
29 SharedPtr<ServerPort> server_port(new ServerPort); 29 SharedPtr<ServerPort> server_port(new ServerPort);
30 SharedPtr<ClientPort> client_port(new ClientPort); 30 SharedPtr<ClientPort> client_port(new ClientPort);
31 31
32 server_port->name = name + "_Server"; 32 server_port->name = name + "_Server";
33 server_port->hle_handler = std::move(hle_handler);
34 client_port->name = name + "_Client"; 33 client_port->name = name + "_Client";
35 client_port->server_port = server_port; 34 client_port->server_port = server_port;
36 client_port->max_sessions = max_sessions; 35 client_port->max_sessions = max_sessions;
diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h
index 281559acf..f1419cd46 100644
--- a/src/core/hle/kernel/server_port.h
+++ b/src/core/hle/kernel/server_port.h
@@ -20,15 +20,13 @@ class ServerPort final : public WaitObject {
20public: 20public:
21 /** 21 /**
22 * Creates a pair of ServerPort and an associated ClientPort. 22 * Creates a pair of ServerPort and an associated ClientPort.
23 *
23 * @param max_sessions Maximum number of sessions to the port 24 * @param max_sessions Maximum number of sessions to the port
24 * @param name Optional name of the ports 25 * @param name Optional name of the ports
25 * @param hle_handler Optional HLE handler template for the port,
26 * ServerSessions crated from this port will inherit a reference to this handler.
27 * @return The created port tuple 26 * @return The created port tuple
28 */ 27 */
29 static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair( 28 static std::tuple<SharedPtr<ServerPort>, SharedPtr<ClientPort>> CreatePortPair(
30 u32 max_sessions, std::string name = "UnknownPort", 29 u32 max_sessions, std::string name = "UnknownPort");
31 std::shared_ptr<SessionRequestHandler> hle_handler = nullptr);
32 30
33 std::string GetTypeName() const override { 31 std::string GetTypeName() const override {
34 return "ServerPort"; 32 return "ServerPort";
@@ -42,6 +40,14 @@ public:
42 return HANDLE_TYPE; 40 return HANDLE_TYPE;
43 } 41 }
44 42
43 /**
44 * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port
45 * will inherit a reference to this handler.
46 */
47 void SetHleHandler(std::shared_ptr<SessionRequestHandler> hle_handler_) {
48 hle_handler = std::move(hle_handler_);
49 }
50
45 std::string name; ///< Name of port (optional) 51 std::string name; ///< Name of port (optional)
46 52
47 std::vector<SharedPtr<WaitObject>> 53 std::vector<SharedPtr<WaitObject>>
diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp
index dc39d5229..2dc709bc9 100644
--- a/src/core/hle/kernel/server_session.cpp
+++ b/src/core/hle/kernel/server_session.cpp
@@ -28,16 +28,14 @@ ServerSession::~ServerSession() {
28 parent->server = nullptr; 28 parent->server = nullptr;
29} 29}
30 30
31ResultVal<SharedPtr<ServerSession>> ServerSession::Create( 31ResultVal<SharedPtr<ServerSession>> ServerSession::Create(std::string name) {
32 std::string name, std::shared_ptr<SessionRequestHandler> hle_handler) {
33 SharedPtr<ServerSession> server_session(new ServerSession); 32 SharedPtr<ServerSession> server_session(new ServerSession);
34 33
35 server_session->name = std::move(name); 34 server_session->name = std::move(name);
36 server_session->signaled = false; 35 server_session->signaled = false;
37 server_session->hle_handler = std::move(hle_handler);
38 server_session->parent = nullptr; 36 server_session->parent = nullptr;
39 37
40 return MakeResult<SharedPtr<ServerSession>>(std::move(server_session)); 38 return MakeResult(std::move(server_session));
41} 39}
42 40
43bool ServerSession::ShouldWait(Thread* thread) const { 41bool ServerSession::ShouldWait(Thread* thread) const {
@@ -71,13 +69,9 @@ ResultCode ServerSession::HandleSyncRequest() {
71 return RESULT_SUCCESS; 69 return RESULT_SUCCESS;
72} 70}
73 71
74ServerSession::SessionPair ServerSession::CreateSessionPair( 72ServerSession::SessionPair ServerSession::CreateSessionPair(const std::string& name,
75 const std::string& name, std::shared_ptr<SessionRequestHandler> hle_handler, 73 SharedPtr<ClientPort> port) {
76 SharedPtr<ClientPort> port) { 74 auto server_session = ServerSession::Create(name + "_Server").MoveFrom();
77
78 auto server_session =
79 ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom();
80
81 SharedPtr<ClientSession> client_session(new ClientSession); 75 SharedPtr<ClientSession> client_session(new ClientSession);
82 client_session->name = name + "_Client"; 76 client_session->name = name + "_Client";
83 77
diff --git a/src/core/hle/kernel/server_session.h b/src/core/hle/kernel/server_session.h
index 62d23cf0a..28f365b9e 100644
--- a/src/core/hle/kernel/server_session.h
+++ b/src/core/hle/kernel/server_session.h
@@ -50,14 +50,20 @@ public:
50 /** 50 /**
51 * Creates a pair of ServerSession and an associated ClientSession. 51 * Creates a pair of ServerSession and an associated ClientSession.
52 * @param name Optional name of the ports. 52 * @param name Optional name of the ports.
53 * @param hle_handler Optional HLE handler for this server session.
54 * @param client_port Optional The ClientPort that spawned this session. 53 * @param client_port Optional The ClientPort that spawned this session.
55 * @return The created session tuple 54 * @return The created session tuple
56 */ 55 */
57 static SessionPair CreateSessionPair( 56 static SessionPair CreateSessionPair(const std::string& name = "Unknown",
58 const std::string& name = "Unknown", 57 SharedPtr<ClientPort> client_port = nullptr);
59 std::shared_ptr<SessionRequestHandler> hle_handler = nullptr, 58
60 SharedPtr<ClientPort> client_port = nullptr); 59 /**
60 * Sets the HLE handler for the session. This handler will be called to service IPC requests
61 * instead of the regular IPC machinery. (The regular IPC machinery is currently not
62 * implemented.)
63 */
64 void SetHleHandler(std::shared_ptr<SessionRequestHandler> hle_handler_) {
65 hle_handler = std::move(hle_handler_);
66 }
61 67
62 /** 68 /**
63 * Handle a sync request from the emulated application. 69 * Handle a sync request from the emulated application.
@@ -83,11 +89,9 @@ private:
83 * Creates a server session. The server session can have an optional HLE handler, 89 * Creates a server session. The server session can have an optional HLE handler,
84 * which will be invoked to handle the IPC requests that this session receives. 90 * which will be invoked to handle the IPC requests that this session receives.
85 * @param name Optional name of the server session. 91 * @param name Optional name of the server session.
86 * @param hle_handler Optional HLE handler for this server session.
87 * @return The created server session 92 * @return The created server session
88 */ 93 */
89 static ResultVal<SharedPtr<ServerSession>> Create( 94 static ResultVal<SharedPtr<ServerSession>> Create(std::string name = "Unknown");
90 std::string name = "Unknown", std::shared_ptr<SessionRequestHandler> hle_handler = nullptr);
91}; 95};
92 96
93/** 97/**
diff --git a/src/core/hle/result.h b/src/core/hle/result.h
index c49650f7d..5f2cdbb96 100644
--- a/src/core/hle/result.h
+++ b/src/core/hle/result.h
@@ -416,6 +416,16 @@ ResultVal<T> MakeResult(Args&&... args) {
416} 416}
417 417
418/** 418/**
419 * Deducible overload of MakeResult, allowing the template parameter to be ommited if you're just
420 * copy or move constructing.
421 */
422template <typename Arg>
423ResultVal<std::remove_reference_t<Arg>> MakeResult(Arg&& arg) {
424 return ResultVal<std::remove_reference_t<Arg>>::WithCode(RESULT_SUCCESS,
425 std::forward<Arg>(arg));
426}
427
428/**
419 * Check for the success of `source` (which must evaluate to a ResultVal). If it succeeds, unwraps 429 * Check for the success of `source` (which must evaluate to a ResultVal). If it succeeds, unwraps
420 * the contained value and assigns it to `target`, which can be either an l-value expression or a 430 * the contained value and assigns it to `target`, which can be either an l-value expression or a
421 * variable declaration. If it fails the return code is returned from the current function. Thus it 431 * variable declaration. If it fails the return code is returned from the current function. Thus it
@@ -426,3 +436,12 @@ ResultVal<T> MakeResult(Args&&... args) {
426 if (CONCAT2(check_result_L, __LINE__).Failed()) \ 436 if (CONCAT2(check_result_L, __LINE__).Failed()) \
427 return CONCAT2(check_result_L, __LINE__).Code(); \ 437 return CONCAT2(check_result_L, __LINE__).Code(); \
428 target = std::move(*CONCAT2(check_result_L, __LINE__)) 438 target = std::move(*CONCAT2(check_result_L, __LINE__))
439
440/**
441 * Analogous to CASCADE_RESULT, but for a bare ResultCode. The code will be propagated if
442 * non-success, or discarded otherwise.
443 */
444#define CASCADE_CODE(source) \
445 auto CONCAT2(check_result_L, __LINE__) = source; \
446 if (CONCAT2(check_result_L, __LINE__).IsError()) \
447 return CONCAT2(check_result_L, __LINE__);
diff --git a/src/core/hle/service/fs/archive.cpp b/src/core/hle/service/fs/archive.cpp
index d6128d6a7..bbc5f8067 100644
--- a/src/core/hle/service/fs/archive.cpp
+++ b/src/core/hle/service/fs/archive.cpp
@@ -84,6 +84,10 @@ File::File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path&
84File::~File() {} 84File::~File() {}
85 85
86void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { 86void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
87 using Kernel::ClientSession;
88 using Kernel::ServerSession;
89 using Kernel::SharedPtr;
90
87 u32* cmd_buff = Kernel::GetCommandBuffer(); 91 u32* cmd_buff = Kernel::GetCommandBuffer();
88 FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]); 92 FileCommand cmd = static_cast<FileCommand>(cmd_buff[0]);
89 switch (cmd) { 93 switch (cmd) {
@@ -162,10 +166,9 @@ void File::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_ses
162 166
163 case FileCommand::OpenLinkFile: { 167 case FileCommand::OpenLinkFile: {
164 LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str()); 168 LOG_WARNING(Service_FS, "(STUBBED) File command OpenLinkFile %s", GetName().c_str());
165 auto sessions = Kernel::ServerSession::CreateSessionPair(GetName(), shared_from_this()); 169 auto sessions = ServerSession::CreateSessionPair(GetName());
166 ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); 170 ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
167 cmd_buff[3] = Kernel::g_handle_table 171 cmd_buff[3] = Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions))
168 .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions))
169 .ValueOr(INVALID_HANDLE); 172 .ValueOr(INVALID_HANDLE);
170 break; 173 break;
171 } 174 }
diff --git a/src/core/hle/service/fs/archive.h b/src/core/hle/service/fs/archive.h
index 28e33caaa..3a3371c88 100644
--- a/src/core/hle/service/fs/archive.h
+++ b/src/core/hle/service/fs/archive.h
@@ -43,7 +43,7 @@ enum class MediaType : u32 { NAND = 0, SDMC = 1, GameCard = 2 };
43 43
44typedef u64 ArchiveHandle; 44typedef u64 ArchiveHandle;
45 45
46class File final : public Kernel::SessionRequestHandler, public std::enable_shared_from_this<File> { 46class File final : public Kernel::SessionRequestHandler {
47public: 47public:
48 File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path); 48 File(std::unique_ptr<FileSys::FileBackend>&& backend, const FileSys::Path& path);
49 ~File(); 49 ~File();
diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp
index fafdd3cc8..fe50403b9 100644
--- a/src/core/hle/service/fs/fs_user.cpp
+++ b/src/core/hle/service/fs/fs_user.cpp
@@ -20,8 +20,9 @@
20//////////////////////////////////////////////////////////////////////////////////////////////////// 20////////////////////////////////////////////////////////////////////////////////////////////////////
21// Namespace FS_User 21// Namespace FS_User
22 22
23using Kernel::SharedPtr; 23using Kernel::ClientSession;
24using Kernel::ServerSession; 24using Kernel::ServerSession;
25using Kernel::SharedPtr;
25 26
26namespace Service { 27namespace Service {
27namespace FS { 28namespace FS {
@@ -79,11 +80,11 @@ static void OpenFile(Service::Interface* self) {
79 rb.Push(file_res.Code()); 80 rb.Push(file_res.Code());
80 if (file_res.Succeeded()) { 81 if (file_res.Succeeded()) {
81 std::shared_ptr<File> file = *file_res; 82 std::shared_ptr<File> file = *file_res;
82 auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); 83 auto sessions = ServerSession::CreateSessionPair(file->GetName());
83 file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); 84 file->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
84 rb.PushMoveHandles(Kernel::g_handle_table 85
85 .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) 86 rb.PushMoveHandles(
86 .MoveFrom()); 87 Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom());
87 } else { 88 } else {
88 rb.PushMoveHandles(0); 89 rb.PushMoveHandles(0);
89 LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str()); 90 LOG_ERROR(Service_FS, "failed to get a handle for file %s", file_path.DebugStr().c_str());
@@ -145,11 +146,11 @@ static void OpenFileDirectly(Service::Interface* self) {
145 cmd_buff[1] = file_res.Code().raw; 146 cmd_buff[1] = file_res.Code().raw;
146 if (file_res.Succeeded()) { 147 if (file_res.Succeeded()) {
147 std::shared_ptr<File> file = *file_res; 148 std::shared_ptr<File> file = *file_res;
148 auto sessions = ServerSession::CreateSessionPair(file->GetName(), file); 149 auto sessions = ServerSession::CreateSessionPair(file->GetName());
149 file->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); 150 file->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
150 cmd_buff[3] = Kernel::g_handle_table 151
151 .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) 152 cmd_buff[3] =
152 .MoveFrom(); 153 Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom();
153 } else { 154 } else {
154 cmd_buff[3] = 0; 155 cmd_buff[3] = 0;
155 LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u", 156 LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u",
@@ -412,11 +413,11 @@ static void OpenDirectory(Service::Interface* self) {
412 cmd_buff[1] = dir_res.Code().raw; 413 cmd_buff[1] = dir_res.Code().raw;
413 if (dir_res.Succeeded()) { 414 if (dir_res.Succeeded()) {
414 std::shared_ptr<Directory> directory = *dir_res; 415 std::shared_ptr<Directory> directory = *dir_res;
415 auto sessions = ServerSession::CreateSessionPair(directory->GetName(), directory); 416 auto sessions = ServerSession::CreateSessionPair(directory->GetName());
416 directory->ClientConnected(std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions)); 417 directory->ClientConnected(std::get<SharedPtr<ServerSession>>(sessions));
417 cmd_buff[3] = Kernel::g_handle_table 418
418 .Create(std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions)) 419 cmd_buff[3] =
419 .MoveFrom(); 420 Kernel::g_handle_table.Create(std::get<SharedPtr<ClientSession>>(sessions)).MoveFrom();
420 } else { 421 } else {
421 LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s", 422 LOG_ERROR(Service_FS, "failed to get a handle for directory type=%d size=%d data=%s",
422 dirname_type, dirname_size, dir_path.DebugStr().c_str()); 423 dirname_type, dirname_size, dir_path.DebugStr().c_str());
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index bb22e25be..8f7c97d54 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -105,18 +105,22 @@ void Interface::Register(const FunctionInfo* functions, size_t n) {
105// Module interface 105// Module interface
106 106
107static void AddNamedPort(Interface* interface_) { 107static void AddNamedPort(Interface* interface_) {
108 auto ports = 108 Kernel::SharedPtr<Kernel::ServerPort> server_port;
109 Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), 109 Kernel::SharedPtr<Kernel::ClientPort> client_port;
110 std::shared_ptr<Interface>(interface_)); 110 std::tie(server_port, client_port) =
111 auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); 111 Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName());
112
113 server_port->SetHleHandler(std::shared_ptr<Interface>(interface_));
112 g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port)); 114 g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port));
113} 115}
114 116
115void AddService(Interface* interface_) { 117void AddService(Interface* interface_) {
116 auto ports = 118 Kernel::SharedPtr<Kernel::ServerPort> server_port;
117 Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(), 119 Kernel::SharedPtr<Kernel::ClientPort> client_port;
118 std::shared_ptr<Interface>(interface_)); 120 std::tie(server_port, client_port) =
119 auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports); 121 Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName());
122
123 server_port->SetHleHandler(std::shared_ptr<Interface>(interface_));
120 g_srv_services.emplace(interface_->GetPortName(), std::move(client_port)); 124 g_srv_services.emplace(interface_->GetPortName(), std::move(client_port));
121} 125}
122 126