summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/server_manager.h
diff options
context:
space:
mode:
authorLiam <byteslice@airmail.cc>2023-02-19 14:44:54 +0100
committerLiam <byteslice@airmail.cc>2023-02-21 18:19:25 +0100
commit6e0a33089b97747ea0e3dc9d57e19223d420c98a (patch)
tree64e746021d186e84053c14f186f6434c69fcf910 /src/core/hle/service/server_manager.h
parentservice: refactor server architecture (diff)
downloadyuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.tar
yuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.tar.gz
yuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.tar.bz2
yuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.tar.lz
yuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.tar.xz
yuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.tar.zst
yuzu-6e0a33089b97747ea0e3dc9d57e19223d420c98a.zip
Diffstat (limited to '')
-rw-r--r--src/core/hle/service/server_manager.h16
1 files changed, 16 insertions, 0 deletions
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 <atomic>
#include <functional>
+#include <list>
#include <map>
#include <mutex>
#include <string_view>
@@ -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<Kernel::SessionRequestHandler>&& 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<ServerManager>&& server);
private:
+ struct RequestState;
+
Result LoopProcessImpl();
Result WaitAndProcessImpl();
Result OnPortEvent(Kernel::KServerPort* port,
std::shared_ptr<Kernel::SessionRequestHandler>&& handler);
Result OnSessionEvent(Kernel::KServerSession* session,
std::shared_ptr<Kernel::SessionRequestManager>&& manager);
+ Result OnDeferralEvent(std::list<RequestState>&& deferrals);
+ Result CompleteSyncRequest(RequestState&& state);
private:
Core::System& m_system;
@@ -65,6 +72,15 @@ private:
std::map<Kernel::KServerPort*, std::shared_ptr<Kernel::SessionRequestHandler>> m_ports{};
std::map<Kernel::KServerSession*, std::shared_ptr<Kernel::SessionRequestManager>> m_sessions{};
Kernel::KEvent* m_event{};
+ Kernel::KEvent* m_deferral_event{};
+
+ // Deferral tracking
+ struct RequestState {
+ Kernel::KServerSession* session;
+ std::shared_ptr<Kernel::HLERequestContext> context;
+ std::shared_ptr<Kernel::SessionRequestManager> manager;
+ };
+ std::list<RequestState> m_deferrals{};
// Host state tracking
std::atomic<bool> m_stopped{};