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