From a78920e60b13df76e86a57eafa936d0b6ee47b9b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 12 Apr 2018 23:06:21 -0400 Subject: [PATCH] sm: Relocate the service manager to the System class Rather than have it live as a global variable, place it into the System class and make it instance-based. --- src/core/core.cpp | 22 +++++++++--- src/core/core.h | 25 ++++++++++++-- src/core/hle/service/service.cpp | 57 ++++++++++++++++---------------- src/core/hle/service/service.h | 2 +- src/core/hle/service/sm/sm.cpp | 2 -- src/core/hle/service/sm/sm.h | 2 -- 6 files changed, 69 insertions(+), 41 deletions(-) diff --git a/src/core/core.cpp b/src/core/core.cpp index 49181d181..12f2e11a2 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -15,10 +15,12 @@ #include "core/core.h" #include "core/core_timing.h" #include "core/gdbstub/gdbstub.h" +#include "core/hle/kernel/client_port.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/process.h" #include "core/hle/kernel/thread.h" #include "core/hle/service/service.h" +#include "core/hle/service/sm/sm.h" #include "core/hw/hw.h" #include "core/loader/loader.h" #include "core/memory_setup.h" @@ -168,10 +170,11 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { dsp_core->EnableStretching(Settings::values.enable_audio_stretching); telemetry_session = std::make_unique(); + service_manager = std::make_shared(); HW::Init(); Kernel::Init(system_mode); - Service::Init(); + Service::Init(service_manager); GDBStub::Init(); Movie::GetInstance().Init(); @@ -188,6 +191,14 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) { return ResultStatus::Success; } +Service::SM::ServiceManager& System::ServiceManager() { + return *service_manager; +} + +const Service::SM::ServiceManager& System::ServiceManager() const { + return *service_manager; +} + void System::Shutdown() { // Log last frame performance stats auto perf_results = GetAndResetPerfStats(); @@ -205,11 +216,12 @@ void System::Shutdown() { Service::Shutdown(); Kernel::Shutdown(); HW::Shutdown(); - telemetry_session = nullptr; - dsp_core = nullptr; - cpu_core = nullptr; + telemetry_session.reset(); + service_manager.reset(); + dsp_core.reset(); + cpu_core.reset(); CoreTiming::Shutdown(); - app_loader = nullptr; + app_loader.reset(); if (auto room_member = Network::GetRoomMember().lock()) { Network::GameInfo game_info{}; diff --git a/src/core/core.h b/src/core/core.h index 899d94105..a52a01708 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -19,6 +19,12 @@ namespace AudioCore { class DspInterface; } +namespace Service { +namespace SM { +class ServiceManager; +} +} // namespace Service + namespace Core { class System { @@ -114,6 +120,18 @@ public: return *dsp_core; } + /** + * Gets a reference to the service manager. + * @returns A reference to the service manager. + */ + Service::SM::ServiceManager& ServiceManager(); + + /** + * Gets a const reference to the service manager. + * @returns A const reference to the service manager. + */ + const Service::SM::ServiceManager& ServiceManager() const; + PerfStats perf_stats; FrameLimiter frame_limiter; @@ -147,10 +165,10 @@ private: /// AppLoader used to load the current executing application std::unique_ptr app_loader; - ///< ARM11 CPU core + /// ARM11 CPU core std::unique_ptr cpu_core; - ///< DSP core + /// DSP core std::unique_ptr dsp_core; /// When true, signals that a reschedule should happen @@ -159,6 +177,9 @@ private: /// Telemetry session for this emulation session std::unique_ptr telemetry_session; + /// Service manager + std::shared_ptr service_manager; + static System s_instance; ResultStatus status = ResultStatus::Success; diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index fb69ef99e..813893985 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -7,6 +7,7 @@ #include "common/assert.h" #include "common/logging/log.h" #include "common/string_util.h" +#include "core/core.h" #include "core/hle/ipc.h" #include "core/hle/kernel/client_port.h" #include "core/hle/kernel/handle_table.h" @@ -214,48 +215,47 @@ static void AddNamedPort(Interface* interface_) { } void AddService(Interface* interface_) { - auto server_port = - SM::g_service_manager - ->RegisterService(interface_->GetPortName(), interface_->GetMaxSessions()) - .Unwrap(); + auto server_port = Core::System::GetInstance() + .ServiceManager() + .RegisterService(interface_->GetPortName(), interface_->GetMaxSessions()) + .Unwrap(); server_port->SetHleHandler(std::shared_ptr(interface_)); } /// Initialize ServiceManager -void Init() { - SM::g_service_manager = std::make_shared(); - SM::ServiceManager::InstallInterfaces(SM::g_service_manager); +void Init(std::shared_ptr& sm) { + SM::ServiceManager::InstallInterfaces(sm); ERR::InstallInterfaces(); - PXI::InstallInterfaces(*SM::g_service_manager); - NS::InstallInterfaces(*SM::g_service_manager); - AC::InstallInterfaces(*SM::g_service_manager); - LDR::InstallInterfaces(*SM::g_service_manager); - MIC::InstallInterfaces(*SM::g_service_manager); - NWM::InstallInterfaces(*SM::g_service_manager); + PXI::InstallInterfaces(*sm); + NS::InstallInterfaces(*sm); + AC::InstallInterfaces(*sm); + LDR::InstallInterfaces(*sm); + MIC::InstallInterfaces(*sm); + NWM::InstallInterfaces(*sm); - FS::InstallInterfaces(*SM::g_service_manager); + FS::InstallInterfaces(*sm); FS::ArchiveInit(); - ACT::InstallInterfaces(*SM::g_service_manager); - AM::InstallInterfaces(*SM::g_service_manager); - APT::InstallInterfaces(*SM::g_service_manager); + ACT::InstallInterfaces(*sm); + AM::InstallInterfaces(*sm); + APT::InstallInterfaces(*sm); BOSS::Init(); - CAM::InstallInterfaces(*SM::g_service_manager); + CAM::InstallInterfaces(*sm); CECD::Init(); - CFG::InstallInterfaces(*SM::g_service_manager); + CFG::InstallInterfaces(*sm); DLP::Init(); - FRD::InstallInterfaces(*SM::g_service_manager); - GSP::InstallInterfaces(*SM::g_service_manager); - HID::InstallInterfaces(*SM::g_service_manager); - IR::InstallInterfaces(*SM::g_service_manager); + FRD::InstallInterfaces(*sm); + GSP::InstallInterfaces(*sm); + HID::InstallInterfaces(*sm); + IR::InstallInterfaces(*sm); MVD::Init(); NDM::Init(); - NEWS::InstallInterfaces(*SM::g_service_manager); - NFC::InstallInterfaces(*SM::g_service_manager); - NIM::InstallInterfaces(*SM::g_service_manager); + NEWS::InstallInterfaces(*sm); + NFC::InstallInterfaces(*sm); + NIM::InstallInterfaces(*sm); NWM::Init(); - PTM::InstallInterfaces(*SM::g_service_manager); + PTM::InstallInterfaces(*sm); QTM::Init(); AddService(new CSND::CSND_SND); @@ -265,7 +265,7 @@ void Init() { AddService(new PM::PM_APP); AddService(new SOC::SOC_U); AddService(new SSL::SSL_C); - Y2R::InstallInterfaces(*SM::g_service_manager); + Y2R::InstallInterfaces(*sm); LOG_DEBUG(Service, "initialized OK"); } @@ -278,7 +278,6 @@ void Shutdown() { BOSS::Shutdown(); FS::ArchiveShutdown(); - SM::g_service_manager = nullptr; g_kernel_named_ports.clear(); LOG_DEBUG(Service, "shutdown OK"); } diff --git a/src/core/hle/service/service.h b/src/core/hle/service/service.h index 93b069abd..944a9057e 100644 --- a/src/core/hle/service/service.h +++ b/src/core/hle/service/service.h @@ -262,7 +262,7 @@ private: }; /// Initialize ServiceManager -void Init(); +void Init(std::shared_ptr& sm); /// Shutdown ServiceManager void Shutdown(); diff --git a/src/core/hle/service/sm/sm.cpp b/src/core/hle/service/sm/sm.cpp index 854ab9a05..4cb28ca16 100644 --- a/src/core/hle/service/sm/sm.cpp +++ b/src/core/hle/service/sm/sm.cpp @@ -67,7 +67,5 @@ ResultVal> ServiceManager::ConnectToSer return client_port->Connect(); } -std::shared_ptr g_service_manager; - } // namespace SM } // namespace Service diff --git a/src/core/hle/service/sm/sm.h b/src/core/hle/service/sm/sm.h index 9f60a7965..bfd0ef553 100644 --- a/src/core/hle/service/sm/sm.h +++ b/src/core/hle/service/sm/sm.h @@ -52,7 +52,5 @@ private: std::unordered_map> registered_services; }; -extern std::shared_ptr g_service_manager; - } // namespace SM } // namespace Service