From 1afc2c72d6b55f09ccbf88f1c98c114b5a36c8d1 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 6 Apr 2019 01:36:50 -0400 Subject: [PATCH 1/2] kernel/server_port: Return a std::pair from CreatePortPair() Returns the same type that the function name describes. --- src/core/hle/kernel/kernel.h | 5 +++-- src/core/hle/kernel/server_port.cpp | 6 ++---- src/core/hle/kernel/svc.cpp | 8 +++----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 9c32d9060..752c22d55 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -83,6 +83,8 @@ public: std::function prepare_reschedule_callback, u32 system_mode); ~KernelSystem(); + using PortPair = std::tuple, std::shared_ptr>; + /** * Creates an address arbiter. * @@ -150,8 +152,7 @@ public: * @param name Optional name of the ports * @return The created port tuple */ - std::tuple, std::shared_ptr> CreatePortPair( - u32 max_sessions, std::string name = "UnknownPort"); + PortPair CreatePortPair(u32 max_sessions, std::string name = "UnknownPort"); /** * Creates a pair of ServerSession and an associated ClientSession. diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp index f4b54451c..0e08b79e8 100644 --- a/src/core/hle/kernel/server_port.cpp +++ b/src/core/hle/kernel/server_port.cpp @@ -35,9 +35,7 @@ void ServerPort::Acquire(Thread* thread) { ASSERT_MSG(!ShouldWait(thread), "object unavailable!"); } -std::tuple, std::shared_ptr> KernelSystem::CreatePortPair( - u32 max_sessions, std::string name) { - +KernelSystem::PortPair KernelSystem::CreatePortPair(u32 max_sessions, std::string name) { auto server_port{std::make_shared(*this)}; auto client_port{std::make_shared(*this)}; @@ -47,7 +45,7 @@ std::tuple, std::shared_ptr> KernelSyste client_port->max_sessions = max_sessions; client_port->active_sessions = 0; - return std::make_tuple(std::move(server_port), std::move(client_port)); + return std::make_pair(std::move(server_port), std::move(client_port)); } } // namespace Kernel diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index e8c8c32ec..ea4d364c0 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -1292,13 +1292,11 @@ ResultCode SVC::CreatePort(Handle* server_port, Handle* client_port, VAddr name_ std::shared_ptr current_process = kernel.GetCurrentProcess(); - auto ports = kernel.CreatePortPair(max_sessions); - CASCADE_RESULT(*client_port, current_process->handle_table.Create( - std::move(std::get>(ports)))); + auto [server, client] = kernel.CreatePortPair(max_sessions); + CASCADE_RESULT(*client_port, current_process->handle_table.Create(std::move(client))); // Note: The 3DS kernel also leaks the client port handle if the server port handle fails to be // created. - CASCADE_RESULT(*server_port, current_process->handle_table.Create( - std::move(std::get>(ports)))); + CASCADE_RESULT(*server_port, current_process->handle_table.Create(std::move(server))); LOG_TRACE(Kernel_SVC, "called max_sessions={}", max_sessions); return RESULT_SUCCESS; From 42535468c3f52ec14c740bf686394e2eb22ea7cc Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 6 Apr 2019 01:41:43 -0400 Subject: [PATCH 2/2] kernel/server_session: Return a std::pair from CreateSessionPair() Keeps the return type consistent with the function name. While we're at it, we can also reduce the amount of boilerplate involved with handling these by using structured bindings. --- src/core/hle/kernel/client_port.cpp | 9 ++++----- src/core/hle/kernel/kernel.h | 7 ++++--- src/core/hle/kernel/server_session.cpp | 6 +++--- src/core/hle/kernel/svc.cpp | 4 +--- src/core/hle/service/fs/file.cpp | 15 ++++++--------- src/core/hle/service/fs/fs_user.cpp | 6 +++--- src/tests/core/hle/kernel/hle_ipc.cpp | 8 ++++---- 7 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/core/hle/kernel/client_port.cpp b/src/core/hle/kernel/client_port.cpp index 0a4ca3b0a..3cbc0d55a 100644 --- a/src/core/hle/kernel/client_port.cpp +++ b/src/core/hle/kernel/client_port.cpp @@ -26,18 +26,17 @@ ResultVal> ClientPort::Connect() { active_sessions++; // Create a new session pair, let the created sessions inherit the parent port's HLE handler. - auto sessions = kernel.CreateSessionPair(server_port->GetName(), SharedFrom(this)); + auto [server, client] = kernel.CreateSessionPair(server_port->GetName(), SharedFrom(this)); if (server_port->hle_handler) - server_port->hle_handler->ClientConnected( - std::get>(sessions)); + server_port->hle_handler->ClientConnected(server); else - server_port->pending_sessions.push_back(std::get>(sessions)); + server_port->pending_sessions.push_back(server); // Wake the threads waiting on the ServerPort server_port->WakeupAllWaitingThreads(); - return MakeResult(std::get>(sessions)); + return MakeResult(client); } void ClientPort::ConnectionClosed() { diff --git a/src/core/hle/kernel/kernel.h b/src/core/hle/kernel/kernel.h index 752c22d55..c51affac5 100644 --- a/src/core/hle/kernel/kernel.h +++ b/src/core/hle/kernel/kernel.h @@ -83,7 +83,8 @@ public: std::function prepare_reschedule_callback, u32 system_mode); ~KernelSystem(); - using PortPair = std::tuple, std::shared_ptr>; + using PortPair = std::pair, std::shared_ptr>; + using SessionPair = std::pair, std::shared_ptr>; /** * Creates an address arbiter. @@ -160,8 +161,8 @@ public: * @param client_port Optional The ClientPort that spawned this session. * @return The created session tuple */ - std::tuple, std::shared_ptr> CreateSessionPair( - const std::string& name = "Unknown", std::shared_ptr client_port = nullptr); + SessionPair CreateSessionPair(const std::string& name = "Unknown", + std::shared_ptr client_port = nullptr); ResourceLimitList& ResourceLimit(); const ResourceLimitList& ResourceLimit() const; diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 66db5500d..c40ca2e6d 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -120,8 +120,8 @@ ResultCode ServerSession::HandleSyncRequest(std::shared_ptr thread) { return RESULT_SUCCESS; } -std::tuple, std::shared_ptr> -KernelSystem::CreateSessionPair(const std::string& name, std::shared_ptr port) { +KernelSystem::SessionPair KernelSystem::CreateSessionPair(const std::string& name, + std::shared_ptr port) { auto server_session = ServerSession::Create(*this, name + "_Server").Unwrap(); auto client_session{std::make_shared(*this)}; client_session->name = name + "_Client"; @@ -134,7 +134,7 @@ KernelSystem::CreateSessionPair(const std::string& name, std::shared_ptrparent = parent; server_session->parent = parent; - return std::make_tuple(std::move(server_session), std::move(client_session)); + return std::make_pair(std::move(server_session), std::move(client_session)); } } // namespace Kernel diff --git a/src/core/hle/kernel/svc.cpp b/src/core/hle/kernel/svc.cpp index ea4d364c0..88a0ff5ba 100644 --- a/src/core/hle/kernel/svc.cpp +++ b/src/core/hle/kernel/svc.cpp @@ -1315,14 +1315,12 @@ ResultCode SVC::CreateSessionToPort(Handle* out_client_session, Handle client_po } ResultCode SVC::CreateSession(Handle* server_session, Handle* client_session) { - auto sessions = kernel.CreateSessionPair(); + auto [server, client] = kernel.CreateSessionPair(); std::shared_ptr current_process = kernel.GetCurrentProcess(); - auto& server = std::get>(sessions); CASCADE_RESULT(*server_session, current_process->handle_table.Create(std::move(server))); - auto& client = std::get>(sessions); CASCADE_RESULT(*client_session, current_process->handle_table.Create(std::move(client))); LOG_TRACE(Kernel_SVC, "called"); diff --git a/src/core/hle/service/fs/file.cpp b/src/core/hle/service/fs/file.cpp index fc98afc39..e31f89d0e 100644 --- a/src/core/hle/service/fs/file.cpp +++ b/src/core/hle/service/fs/file.cpp @@ -197,8 +197,7 @@ void File::OpenLinkFile(Kernel::HLERequestContext& ctx) { using Kernel::ServerSession; IPC::RequestParser rp(ctx, 0x080C, 0, 0); IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); - auto sessions = system.Kernel().CreateSessionPair(GetName()); - auto server = std::get>(sessions); + auto [server, client] = system.Kernel().CreateSessionPair(GetName()); ClientConnected(server); FileSessionSlot* slot = GetSessionData(server); @@ -210,7 +209,7 @@ void File::OpenLinkFile(Kernel::HLERequestContext& ctx) { slot->subfile = false; rb.Push(RESULT_SUCCESS); - rb.PushMoveObjects(std::get>(sessions)); + rb.PushMoveObjects(client); } void File::OpenSubFile(Kernel::HLERequestContext& ctx) { @@ -244,8 +243,7 @@ void File::OpenSubFile(Kernel::HLERequestContext& ctx) { using Kernel::ClientSession; using Kernel::ServerSession; - auto sessions = system.Kernel().CreateSessionPair(GetName()); - auto server = std::get>(sessions); + auto [server, client] = system.Kernel().CreateSessionPair(GetName()); ClientConnected(server); FileSessionSlot* slot = GetSessionData(server); @@ -255,12 +253,11 @@ void File::OpenSubFile(Kernel::HLERequestContext& ctx) { slot->subfile = true; rb.Push(RESULT_SUCCESS); - rb.PushMoveObjects(std::get>(sessions)); + rb.PushMoveObjects(client); } std::shared_ptr File::Connect() { - auto sessions = system.Kernel().CreateSessionPair(GetName()); - auto server = std::get>(sessions); + auto [server, client] = system.Kernel().CreateSessionPair(GetName()); ClientConnected(server); FileSessionSlot* slot = GetSessionData(server); @@ -269,7 +266,7 @@ std::shared_ptr File::Connect() { slot->size = backend->GetSize(); slot->subfile = false; - return std::get>(sessions); + return client; } std::size_t File::GetSessionFileOffset(std::shared_ptr session) { diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp index 9e57fa1c4..bca8e77e5 100644 --- a/src/core/hle/service/fs/fs_user.cpp +++ b/src/core/hle/service/fs/fs_user.cpp @@ -306,9 +306,9 @@ void FS_USER::OpenDirectory(Kernel::HLERequestContext& ctx) { rb.Push(dir_res.Code()); if (dir_res.Succeeded()) { std::shared_ptr directory = *dir_res; - auto sessions = system.Kernel().CreateSessionPair(directory->GetName()); - directory->ClientConnected(std::get>(sessions)); - rb.PushMoveObjects(std::get>(sessions)); + auto [server, client] = system.Kernel().CreateSessionPair(directory->GetName()); + directory->ClientConnected(server); + rb.PushMoveObjects(client); } else { LOG_ERROR(Service_FS, "failed to get a handle for directory type={} size={} data={}", static_cast(dirname_type), dirname_size, dir_path.DebugStr()); diff --git a/src/tests/core/hle/kernel/hle_ipc.cpp b/src/tests/core/hle/kernel/hle_ipc.cpp index 2dd3a0424..fb549f829 100644 --- a/src/tests/core/hle/kernel/hle_ipc.cpp +++ b/src/tests/core/hle/kernel/hle_ipc.cpp @@ -24,8 +24,8 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel Core::Timing timing; Memory::MemorySystem memory; Kernel::KernelSystem kernel(memory, timing, [] {}, 0); - auto session = std::get>(kernel.CreateSessionPair()); - HLERequestContext context(kernel, std::move(session), nullptr); + auto [server, client] = kernel.CreateSessionPair(); + HLERequestContext context(kernel, std::move(server), nullptr); auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); @@ -236,8 +236,8 @@ TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { Core::Timing timing; Memory::MemorySystem memory; Kernel::KernelSystem kernel(memory, timing, [] {}, 0); - auto session = std::get>(kernel.CreateSessionPair()); - HLERequestContext context(kernel, std::move(session), nullptr); + auto [server, client] = kernel.CreateSessionPair(); + HLERequestContext context(kernel, std::move(server), nullptr); auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); auto* input = context.CommandBuffer();