server_manager.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <list>
  5. #include <mutex>
  6. #include <optional>
  7. #include <vector>
  8. #include "common/polyfill_thread.h"
  9. #include "common/thread.h"
  10. #include "core/hle/result.h"
  11. #include "core/hle/service/hle_ipc.h"
  12. #include "core/hle/service/os/multi_wait.h"
  13. #include "core/hle/service/os/mutex.h"
  14. namespace Core {
  15. class System;
  16. }
  17. namespace Kernel {
  18. class KEvent;
  19. class KServerPort;
  20. class KServerSession;
  21. } // namespace Kernel
  22. namespace Service {
  23. class Port;
  24. class Session;
  25. class ServerManager {
  26. public:
  27. explicit ServerManager(Core::System& system);
  28. ~ServerManager();
  29. Result RegisterSession(Kernel::KServerSession* session,
  30. std::shared_ptr<SessionRequestManager> manager);
  31. Result RegisterNamedService(const std::string& service_name,
  32. SessionRequestHandlerFactory&& handler_factory,
  33. u32 max_sessions = 64);
  34. Result RegisterNamedService(const std::string& service_name,
  35. std::shared_ptr<SessionRequestHandler>&& handler,
  36. u32 max_sessions = 64);
  37. Result ManageNamedPort(const std::string& service_name,
  38. SessionRequestHandlerFactory&& handler_factory, u32 max_sessions = 64);
  39. Result ManageDeferral(Kernel::KEvent** out_event);
  40. Result LoopProcess();
  41. void StartAdditionalHostThreads(const char* name, size_t num_threads);
  42. static void RunServer(std::unique_ptr<ServerManager>&& server);
  43. private:
  44. void LinkToDeferredList(MultiWaitHolder* holder);
  45. void LinkDeferred();
  46. MultiWaitHolder* WaitSignaled();
  47. Result Process(MultiWaitHolder* holder);
  48. bool WaitAndProcessImpl();
  49. Result LoopProcessImpl();
  50. Result OnPortEvent(Port* port);
  51. Result OnSessionEvent(Session* session);
  52. Result OnDeferralEvent();
  53. Result CompleteSyncRequest(Session* session);
  54. private:
  55. void DestroySession(Session* session);
  56. private:
  57. Core::System& m_system;
  58. Mutex m_selection_mutex;
  59. // Events
  60. Kernel::KEvent* m_wakeup_event{};
  61. Kernel::KEvent* m_deferral_event{};
  62. // Deferred wait list
  63. std::mutex m_deferred_list_mutex{};
  64. MultiWait m_deferred_list{};
  65. // Guest state tracking
  66. MultiWait m_multi_wait{};
  67. Common::IntrusiveListBaseTraits<Port>::ListType m_servers{};
  68. Common::IntrusiveListBaseTraits<Session>::ListType m_sessions{};
  69. std::list<Session*> m_deferred_sessions{};
  70. std::optional<MultiWaitHolder> m_wakeup_holder{};
  71. std::optional<MultiWaitHolder> m_deferral_holder{};
  72. // Host state tracking
  73. Common::Event m_stopped{};
  74. std::vector<std::jthread> m_threads{};
  75. std::stop_source m_stop_source{};
  76. };
  77. } // namespace Service