server_manager.h 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <atomic>
  5. #include <functional>
  6. #include <list>
  7. #include <map>
  8. #include <mutex>
  9. #include <string_view>
  10. #include <vector>
  11. #include "common/polyfill_thread.h"
  12. #include "core/hle/result.h"
  13. #include "core/hle/service/mutex.h"
  14. namespace Core {
  15. class System;
  16. }
  17. namespace Kernel {
  18. class HLERequestContext;
  19. class KEvent;
  20. class KServerPort;
  21. class KServerSession;
  22. class KSynchronizationObject;
  23. class SessionRequestHandler;
  24. class SessionRequestManager;
  25. } // namespace Kernel
  26. namespace Service {
  27. class ServerManager {
  28. public:
  29. explicit ServerManager(Core::System& system);
  30. ~ServerManager();
  31. Result RegisterSession(Kernel::KServerSession* session,
  32. std::shared_ptr<Kernel::SessionRequestManager> manager);
  33. Result RegisterNamedService(const std::string& service_name,
  34. std::shared_ptr<Kernel::SessionRequestHandler>&& handler,
  35. u32 max_sessions = 64);
  36. Result ManageNamedPort(const std::string& service_name,
  37. std::shared_ptr<Kernel::SessionRequestHandler>&& handler,
  38. 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. struct RequestState;
  45. Result LoopProcessImpl();
  46. Result WaitAndProcessImpl();
  47. Result OnPortEvent(Kernel::KServerPort* port,
  48. std::shared_ptr<Kernel::SessionRequestHandler>&& handler);
  49. Result OnSessionEvent(Kernel::KServerSession* session,
  50. std::shared_ptr<Kernel::SessionRequestManager>&& manager);
  51. Result OnDeferralEvent(std::list<RequestState>&& deferrals);
  52. Result CompleteSyncRequest(RequestState&& state);
  53. private:
  54. Core::System& m_system;
  55. Mutex m_serve_mutex;
  56. std::mutex m_list_mutex;
  57. // Guest state tracking
  58. std::map<Kernel::KServerPort*, std::shared_ptr<Kernel::SessionRequestHandler>> m_ports{};
  59. std::map<Kernel::KServerSession*, std::shared_ptr<Kernel::SessionRequestManager>> m_sessions{};
  60. Kernel::KEvent* m_event{};
  61. Kernel::KEvent* m_deferral_event{};
  62. // Deferral tracking
  63. struct RequestState {
  64. Kernel::KServerSession* session;
  65. std::shared_ptr<Kernel::HLERequestContext> context;
  66. std::shared_ptr<Kernel::SessionRequestManager> manager;
  67. };
  68. std::list<RequestState> m_deferrals{};
  69. // Host state tracking
  70. std::atomic<bool> m_stopped{};
  71. std::vector<std::jthread> m_threads{};
  72. std::stop_source m_stop_source{};
  73. };
  74. } // namespace Service