From 42535468c3f52ec14c740bf686394e2eb22ea7cc Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 6 Apr 2019 01:41:43 -0400 Subject: [PATCH] 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 0a4ca3b0a1..3cbc0d55a9 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 752c22d555..c51affac5e 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 66db5500dc..c40ca2e6d4 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 ea4d364c08..88a0ff5ba2 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 fc98afc39c..e31f89d0e7 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 9e57fa1c4e..bca8e77e53 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 2dd3a0424a..fb549f829d 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();