From a9369726147c7499e0016e183d5d56a7b44efe4b Mon Sep 17 00:00:00 2001 From: Liam Date: Sat, 18 Feb 2023 16:26:48 -0500 Subject: service: refactor server architecture Converts services to have their own processes --- src/core/hle/service/server_manager.h | 75 +++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/core/hle/service/server_manager.h (limited to 'src/core/hle/service/server_manager.h') diff --git a/src/core/hle/service/server_manager.h b/src/core/hle/service/server_manager.h new file mode 100644 index 000000000..b26557172 --- /dev/null +++ b/src/core/hle/service/server_manager.h @@ -0,0 +1,75 @@ +// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "common/polyfill_thread.h" +#include "core/hle/result.h" +#include "core/hle/service/mutex.h" + +namespace Core { +class System; +} + +namespace Kernel { +class KEvent; +class KServerPort; +class KServerSession; +class KSynchronizationObject; +class SessionRequestHandler; +class SessionRequestManager; +} // namespace Kernel + +namespace Service { + +class ServerManager { +public: + explicit ServerManager(Core::System& system); + ~ServerManager(); + + Result RegisterSession(Kernel::KServerSession* session, + std::shared_ptr manager); + Result RegisterNamedService(const std::string& service_name, + std::shared_ptr&& handler, + u32 max_sessions = 64); + Result ManageNamedPort(const std::string& service_name, + std::shared_ptr&& handler, + u32 max_sessions = 64); + + Result LoopProcess(); + void StartAdditionalHostThreads(const char* name, size_t num_threads); + + static void RunServer(std::unique_ptr&& server); + +private: + Result LoopProcessImpl(); + Result WaitAndProcessImpl(); + Result OnPortEvent(Kernel::KServerPort* port, + std::shared_ptr&& handler); + Result OnSessionEvent(Kernel::KServerSession* session, + std::shared_ptr&& manager); + +private: + Core::System& m_system; + Mutex m_serve_mutex; + std::mutex m_list_mutex; + + // Guest state tracking + std::map> m_ports{}; + std::map> m_sessions{}; + Kernel::KEvent* m_event{}; + + // Host state tracking + std::atomic m_stopped{}; + std::vector m_threads{}; + std::stop_source m_stop_source{}; +}; + +} // namespace Service -- cgit v1.2.3 From 6e0a33089b97747ea0e3dc9d57e19223d420c98a Mon Sep 17 00:00:00 2001 From: Liam Date: Sun, 19 Feb 2023 08:44:54 -0500 Subject: sm:: support service registration deferral --- src/core/hle/service/server_manager.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src/core/hle/service/server_manager.h') diff --git a/src/core/hle/service/server_manager.h b/src/core/hle/service/server_manager.h index b26557172..57b954ae8 100644 --- a/src/core/hle/service/server_manager.h +++ b/src/core/hle/service/server_manager.h @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -19,6 +20,7 @@ class System; } namespace Kernel { +class HLERequestContext; class KEvent; class KServerPort; class KServerSession; @@ -42,6 +44,7 @@ public: Result ManageNamedPort(const std::string& service_name, std::shared_ptr&& handler, u32 max_sessions = 64); + Result ManageDeferral(Kernel::KEvent** out_event); Result LoopProcess(); void StartAdditionalHostThreads(const char* name, size_t num_threads); @@ -49,12 +52,16 @@ public: static void RunServer(std::unique_ptr&& server); private: + struct RequestState; + Result LoopProcessImpl(); Result WaitAndProcessImpl(); Result OnPortEvent(Kernel::KServerPort* port, std::shared_ptr&& handler); Result OnSessionEvent(Kernel::KServerSession* session, std::shared_ptr&& manager); + Result OnDeferralEvent(std::list&& deferrals); + Result CompleteSyncRequest(RequestState&& state); private: Core::System& m_system; @@ -65,6 +72,15 @@ private: std::map> m_ports{}; std::map> m_sessions{}; Kernel::KEvent* m_event{}; + Kernel::KEvent* m_deferral_event{}; + + // Deferral tracking + struct RequestState { + Kernel::KServerSession* session; + std::shared_ptr context; + std::shared_ptr manager; + }; + std::list m_deferrals{}; // Host state tracking std::atomic m_stopped{}; -- cgit v1.2.3