// 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 "common/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; } // namespace Kernel namespace Service { class HLERequestContext; class SessionRequestHandler; class SessionRequestManager; 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 ManageDeferral(Kernel::KEvent** out_event); Result LoopProcess(); void StartAdditionalHostThreads(const char* name, size_t num_threads); 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; Mutex m_serve_mutex; std::mutex m_list_mutex; // Guest state tracking 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 Common::Event m_stopped{}; std::vector m_threads{}; std::stop_source m_stop_source{}; }; } // namespace Service