From 7a068641006da739d6af5681a022018785379365 Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 21 Apr 2021 21:53:56 -0700 Subject: hle: kernel: Migrate KServerPort to KAutoObject. --- src/core/hle/kernel/k_client_port.cpp | 4 +- src/core/hle/kernel/k_client_port.h | 14 ++--- src/core/hle/kernel/k_server_port.cpp | 65 +++++++++++++++++++++ src/core/hle/kernel/k_server_port.h | 104 ++++++++++++++++++++++++++++++++++ src/core/hle/kernel/server_port.cpp | 55 ------------------ src/core/hle/kernel/server_port.h | 98 -------------------------------- src/core/hle/service/service.cpp | 4 +- src/core/hle/service/sm/sm.cpp | 14 ++--- src/core/hle/service/sm/sm.h | 7 +-- 9 files changed, 190 insertions(+), 175 deletions(-) create mode 100644 src/core/hle/kernel/k_server_port.cpp create mode 100644 src/core/hle/kernel/k_server_port.h delete mode 100644 src/core/hle/kernel/server_port.cpp delete mode 100644 src/core/hle/kernel/server_port.h (limited to 'src/core/hle') diff --git a/src/core/hle/kernel/k_client_port.cpp b/src/core/hle/kernel/k_client_port.cpp index 15bf0d4fc..00e1bbc59 100644 --- a/src/core/hle/kernel/k_client_port.cpp +++ b/src/core/hle/kernel/k_client_port.cpp @@ -4,9 +4,9 @@ #include "core/hle/kernel/hle_ipc.h" #include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_server_port.h" #include "core/hle/kernel/k_session.h" #include "core/hle/kernel/object.h" -#include "core/hle/kernel/server_port.h" #include "core/hle/kernel/svc_results.h" namespace Kernel { @@ -19,7 +19,7 @@ void KClientPort::Initialize(s32 max_sessions_, std::string&& name_) { name = std::move(name_); } -std::shared_ptr KClientPort::GetServerPort() const { +KServerPort* KClientPort::GetServerPort() const { return server_port; } diff --git a/src/core/hle/kernel/k_client_port.h b/src/core/hle/kernel/k_client_port.h index 04ee2d664..60dea4763 100644 --- a/src/core/hle/kernel/k_client_port.h +++ b/src/core/hle/kernel/k_client_port.h @@ -15,7 +15,7 @@ namespace Kernel { class KClientSession; class KernelCore; -class ServerPort; +class KServerPort; class KClientPort final : public KSynchronizationObject { KERNEL_AUTOOBJECT_TRAITS(KClientPort, KSynchronizationObject); @@ -24,11 +24,11 @@ public: explicit KClientPort(KernelCore& kernel); virtual ~KClientPort() override; - friend class ServerPort; + friend class KServerPort; void Initialize(s32 max_sessions_, std::string&& name_); - std::shared_ptr GetServerPort() const; + KServerPort* GetServerPort() const; /** * Creates a new Session pair, adds the created ServerSession to the associated ServerPort's @@ -63,10 +63,10 @@ public: } private: - std::shared_ptr server_port; ///< ServerPort associated with this client port. - s32 max_sessions = 0; ///< Maximum number of simultaneous sessions the port can have - std::atomic num_sessions = 0; ///< Number of currently open sessions to this port - std::string name; ///< Name of client port (optional) + KServerPort* server_port{}; ///< ServerPort associated with this client port. + s32 max_sessions{}; ///< Maximum number of simultaneous sessions the port can have + std::atomic num_sessions{}; ///< Number of currently open sessions to this port + std::string name; ///< Name of client port (optional) }; } // namespace Kernel diff --git a/src/core/hle/kernel/k_server_port.cpp b/src/core/hle/kernel/k_server_port.cpp new file mode 100644 index 000000000..2c51d66db --- /dev/null +++ b/src/core/hle/kernel/k_server_port.cpp @@ -0,0 +1,65 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include +#include "common/assert.h" +#include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_server_port.h" +#include "core/hle/kernel/k_server_session.h" +#include "core/hle/kernel/k_thread.h" +#include "core/hle/kernel/object.h" +#include "core/hle/kernel/svc_results.h" + +namespace Kernel { + +KServerPort::KServerPort(KernelCore& kernel) : KSynchronizationObject{kernel} {} +KServerPort::~KServerPort() = default; + +void KServerPort::Initialize(std::string&& name_) { + // Set member variables. + name = std::move(name_); +} + +ResultVal KServerPort::Accept() { + if (pending_sessions.empty()) { + return ResultNotFound; + } + + auto* session = pending_sessions.back(); + pending_sessions.pop_back(); + return MakeResult(session); +} + +void KServerPort::AppendPendingSession(KServerSession* pending_session) { + pending_sessions.push_back(std::move(pending_session)); + if (pending_sessions.size() == 1) { + NotifyAvailable(); + } +} + +void KServerPort::Destroy() {} + +bool KServerPort::IsSignaled() const { + return !pending_sessions.empty(); +} + +KServerPort::PortPair KServerPort::CreatePortPair(KernelCore& kernel, u32 max_sessions, + std::string name) { + KServerPort* server_port = new KServerPort(kernel); + KClientPort* client_port = new KClientPort(kernel); + + KAutoObject::Create(server_port); + KAutoObject::Create(client_port); + + server_port->Initialize(name + "_Server"); + client_port->Initialize(max_sessions, name + "_Client"); + + client_port->server_port = server_port; + + server_port->name = name + "_Server"; + + return std::make_pair(server_port, client_port); +} + +} // namespace Kernel diff --git a/src/core/hle/kernel/k_server_port.h b/src/core/hle/kernel/k_server_port.h new file mode 100644 index 000000000..13fa54e5e --- /dev/null +++ b/src/core/hle/kernel/k_server_port.h @@ -0,0 +1,104 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once + +#include +#include +#include +#include +#include "common/common_types.h" +#include "core/hle/kernel/k_synchronization_object.h" +#include "core/hle/kernel/object.h" +#include "core/hle/result.h" + +namespace Kernel { + +class KClientPort; +class KernelCore; +class KServerSession; +class SessionRequestHandler; + +class KServerPort final : public KSynchronizationObject { + KERNEL_AUTOOBJECT_TRAITS(KServerPort, KSynchronizationObject); + +public: + explicit KServerPort(KernelCore& kernel); + virtual ~KServerPort() override; + + using HLEHandler = std::shared_ptr; + using PortPair = std::pair; + + void Initialize(std::string&& name_); + + /** + * Creates a pair of ServerPort and an associated ClientPort. + * + * @param kernel The kernel instance to create the port pair under. + * @param max_sessions Maximum number of sessions to the port + * @param name Optional name of the ports + * @return The created port tuple + */ + static PortPair CreatePortPair(KernelCore& kernel, u32 max_sessions, + std::string name = "UnknownPort"); + + /** + * Accepts a pending incoming connection on this port. If there are no pending sessions, will + * return ERR_NO_PENDING_SESSIONS. + */ + ResultVal Accept(); + + /// Whether or not this server port has an HLE handler available. + bool HasHLEHandler() const { + return hle_handler != nullptr; + } + + /// Gets the HLE handler for this port. + HLEHandler GetHLEHandler() const { + return hle_handler; + } + + /** + * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port + * will inherit a reference to this handler. + */ + void SetHleHandler(HLEHandler hle_handler_) { + hle_handler = std::move(hle_handler_); + } + + /// Appends a ServerSession to the collection of ServerSessions + /// waiting to be accepted by this port. + void AppendPendingSession(KServerSession* pending_session); + + // Overridden virtual functions. + virtual void Destroy() override; + virtual bool IsSignaled() const override; + + // DEPRECATED + + std::string GetTypeName() const override { + return "ServerPort"; + } + std::string GetName() const override { + return name; + } + + static constexpr HandleType HANDLE_TYPE = HandleType::ServerPort; + HandleType GetHandleType() const override { + return HANDLE_TYPE; + } + +private: + /// ServerSessions waiting to be accepted by the port + std::vector pending_sessions; + + /// This session's HLE request handler template (optional) + /// ServerSessions created from this port inherit a reference to this handler. + HLEHandler hle_handler; + + /// Name of the port (optional) + std::string name; +}; + +} // namespace Kernel diff --git a/src/core/hle/kernel/server_port.cpp b/src/core/hle/kernel/server_port.cpp deleted file mode 100644 index addaaa5cf..000000000 --- a/src/core/hle/kernel/server_port.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#include -#include "common/assert.h" -#include "core/hle/kernel/k_client_port.h" -#include "core/hle/kernel/k_server_session.h" -#include "core/hle/kernel/k_thread.h" -#include "core/hle/kernel/object.h" -#include "core/hle/kernel/server_port.h" -#include "core/hle/kernel/svc_results.h" - -namespace Kernel { - -ServerPort::ServerPort(KernelCore& kernel) : KSynchronizationObject{kernel} {} -ServerPort::~ServerPort() = default; - -ResultVal ServerPort::Accept() { - if (pending_sessions.empty()) { - return ResultNotFound; - } - - auto* session = pending_sessions.back(); - pending_sessions.pop_back(); - return MakeResult(session); -} - -void ServerPort::AppendPendingSession(KServerSession* pending_session) { - pending_sessions.push_back(std::move(pending_session)); - if (pending_sessions.size() == 1) { - NotifyAvailable(); - } -} - -bool ServerPort::IsSignaled() const { - return !pending_sessions.empty(); -} - -ServerPort::PortPair ServerPort::CreatePortPair(KernelCore& kernel, u32 max_sessions, - std::string name) { - std::shared_ptr server_port = std::make_shared(kernel); - KClientPort* client_port = new KClientPort(kernel); - - KAutoObject::Create(client_port); - - client_port->Initialize(max_sessions, name + "_Client"); - client_port->server_port = server_port; - - server_port->name = name + "_Server"; - - return std::make_pair(std::move(server_port), client_port); -} - -} // namespace Kernel diff --git a/src/core/hle/kernel/server_port.h b/src/core/hle/kernel/server_port.h deleted file mode 100644 index f7d443df8..000000000 --- a/src/core/hle/kernel/server_port.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2016 Citra Emulator Project -// Licensed under GPLv2 or any later version -// Refer to the license.txt file included. - -#pragma once - -#include -#include -#include -#include -#include "common/common_types.h" -#include "core/hle/kernel/k_synchronization_object.h" -#include "core/hle/kernel/object.h" -#include "core/hle/result.h" - -namespace Kernel { - -class KClientPort; -class KernelCore; -class KServerSession; -class SessionRequestHandler; - -class ServerPort final : public KSynchronizationObject { -public: - explicit ServerPort(KernelCore& kernel); - ~ServerPort() override; - - using HLEHandler = std::shared_ptr; - using PortPair = std::pair, KClientPort*>; - - /** - * Creates a pair of ServerPort and an associated ClientPort. - * - * @param kernel The kernel instance to create the port pair under. - * @param max_sessions Maximum number of sessions to the port - * @param name Optional name of the ports - * @return The created port tuple - */ - static PortPair CreatePortPair(KernelCore& kernel, u32 max_sessions, - std::string name = "UnknownPort"); - - std::string GetTypeName() const override { - return "ServerPort"; - } - std::string GetName() const override { - return name; - } - - static constexpr HandleType HANDLE_TYPE = HandleType::ServerPort; - HandleType GetHandleType() const override { - return HANDLE_TYPE; - } - - /** - * Accepts a pending incoming connection on this port. If there are no pending sessions, will - * return ERR_NO_PENDING_SESSIONS. - */ - ResultVal Accept(); - - /// Whether or not this server port has an HLE handler available. - bool HasHLEHandler() const { - return hle_handler != nullptr; - } - - /// Gets the HLE handler for this port. - HLEHandler GetHLEHandler() const { - return hle_handler; - } - - /** - * Sets the HLE handler template for the port. ServerSessions crated by connecting to this port - * will inherit a reference to this handler. - */ - void SetHleHandler(HLEHandler hle_handler_) { - hle_handler = std::move(hle_handler_); - } - - /// Appends a ServerSession to the collection of ServerSessions - /// waiting to be accepted by this port. - void AppendPendingSession(KServerSession* pending_session); - - bool IsSignaled() const override; - - void Finalize() override {} - -private: - /// ServerSessions waiting to be accepted by the port - std::vector pending_sessions; - - /// This session's HLE request handler template (optional) - /// ServerSessions created from this port inherit a reference to this handler. - HLEHandler hle_handler; - - /// Name of the port (optional) - std::string name; -}; - -} // namespace Kernel diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index d8ad09b49..a882b3b4e 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -12,10 +12,10 @@ #include "core/hle/ipc.h" #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_server_port.h" #include "core/hle/kernel/k_thread.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" -#include "core/hle/kernel/server_port.h" #include "core/hle/service/acc/acc.h" #include "core/hle/service/am/am.h" #include "core/hle/service/aoc/aoc_u.h" @@ -117,7 +117,7 @@ void ServiceFrameworkBase::InstallAsNamedPort(Kernel::KernelCore& kernel) { ASSERT(!port_installed); auto [server_port, client_port] = - Kernel::ServerPort::CreatePortPair(kernel, max_sessions, service_name); + Kernel::KServerPort::CreatePortPair(kernel, max_sessions, service_name); server_port->SetHleHandler(shared_from_this()); kernel.AddNamedPort(service_name, client_port); port_installed = true; diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 39575ce3d..51274bfb1 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -8,9 +8,9 @@ #include "core/hle/ipc_helpers.h" #include "core/hle/kernel/k_client_port.h" #include "core/hle/kernel/k_client_session.h" +#include "core/hle/kernel/k_server_port.h" #include "core/hle/kernel/k_server_session.h" #include "core/hle/kernel/k_session.h" -#include "core/hle/kernel/server_port.h" #include "core/hle/result.h" #include "core/hle/service/sm/controller.h" #include "core/hle/service/sm/sm.h" @@ -49,8 +49,8 @@ void ServiceManager::InstallInterfaces(std::shared_ptr self, Cor self->controller_interface = std::make_unique(system); } -ResultVal> ServiceManager::RegisterService(std::string name, - u32 max_sessions) { +ResultVal ServiceManager::RegisterService(std::string name, + u32 max_sessions) { CASCADE_CODE(ValidateServiceName(name)); @@ -60,12 +60,12 @@ ResultVal> ServiceManager::RegisterService(s } auto [server_port, client_port] = - Kernel::ServerPort::CreatePortPair(kernel, max_sessions, name); + Kernel::KServerPort::CreatePortPair(kernel, max_sessions, name); client_port->Open(); - registered_services.emplace(std::move(name), std::move(client_port)); - return MakeResult(std::move(server_port)); + registered_services.emplace(std::move(name), client_port); + return MakeResult(server_port); } ResultCode ServiceManager::UnregisterService(const std::string& name) { @@ -172,7 +172,7 @@ void SM::RegisterService(Kernel::HLERequestContext& ctx) { rb.Push(handle.Code()); auto server_port = handle.Unwrap(); - rb.PushMoveObjects(server_port.get()); + rb.PushMoveObjects(server_port); } void SM::UnregisterService(Kernel::HLERequestContext& ctx) { diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index aee9aefec..b0204c4bb 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -11,8 +11,8 @@ #include "common/concepts.h" #include "core/hle/kernel/k_client_port.h" +#include "core/hle/kernel/k_server_port.h" #include "core/hle/kernel/object.h" -#include "core/hle/kernel/server_port.h" #include "core/hle/result.h" #include "core/hle/service/service.h" @@ -24,7 +24,7 @@ namespace Kernel { class KClientPort; class KClientSession; class KernelCore; -class ServerPort; +class KServerPort; class SessionRequestHandler; } // namespace Kernel @@ -55,8 +55,7 @@ public: explicit ServiceManager(Kernel::KernelCore& kernel_); ~ServiceManager(); - ResultVal> RegisterService(std::string name, - u32 max_sessions); + ResultVal RegisterService(std::string name, u32 max_sessions); ResultCode UnregisterService(const std::string& name); ResultVal GetServicePort(const std::string& name); -- cgit v1.2.3