core: Relocate g_service_manager to the System class

Converts the service manager from a global into an instance-based
variable.
This commit is contained in:
Lioncash 2018-04-20 19:29:04 -04:00
parent 1df3a7710e
commit 659a612368
6 changed files with 65 additions and 37 deletions

View file

@ -12,10 +12,13 @@
#include "core/core.h" #include "core/core.h"
#include "core/core_timing.h" #include "core/core_timing.h"
#include "core/gdbstub/gdbstub.h" #include "core/gdbstub/gdbstub.h"
#include "core/hle/kernel/client_port.h"
#include "core/hle/kernel/kernel.h" #include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/process.h" #include "core/hle/kernel/process.h"
#include "core/hle/kernel/thread.h" #include "core/hle/kernel/thread.h"
#include "core/hle/service/service.h" #include "core/hle/service/service.h"
#include "core/hle/service/sm/controller.h"
#include "core/hle/service/sm/sm.h"
#include "core/hw/hw.h" #include "core/hw/hw.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "core/memory_setup.h" #include "core/memory_setup.h"
@ -26,6 +29,8 @@ namespace Core {
/*static*/ System System::s_instance; /*static*/ System System::s_instance;
System::~System() = default;
System::ResultStatus System::RunLoop(bool tight_loop) { System::ResultStatus System::RunLoop(bool tight_loop) {
status = ResultStatus::Success; status = ResultStatus::Success;
if (!cpu_core) { if (!cpu_core) {
@ -167,10 +172,12 @@ System::ResultStatus System::Init(EmuWindow* emu_window, u32 system_mode) {
telemetry_session = std::make_unique<Core::TelemetrySession>(); telemetry_session = std::make_unique<Core::TelemetrySession>();
service_manager = std::make_shared<Service::SM::ServiceManager>();
HW::Init(); HW::Init();
Kernel::Init(system_mode); Kernel::Init(system_mode);
scheduler = std::make_unique<Kernel::Scheduler>(cpu_core.get()); scheduler = std::make_unique<Kernel::Scheduler>(cpu_core.get());
Service::Init(); Service::Init(service_manager);
GDBStub::Init(); GDBStub::Init();
if (!VideoCore::Init(emu_window)) { if (!VideoCore::Init(emu_window)) {
@ -200,17 +207,26 @@ void System::Shutdown() {
VideoCore::Shutdown(); VideoCore::Shutdown();
GDBStub::Shutdown(); GDBStub::Shutdown();
Service::Shutdown(); Service::Shutdown();
scheduler = nullptr; scheduler.reset();
Kernel::Shutdown(); Kernel::Shutdown();
HW::Shutdown(); HW::Shutdown();
telemetry_session = nullptr; service_manager.reset();
gpu_core = nullptr; telemetry_session.reset();
cpu_core = nullptr; gpu_core.reset();
cpu_core.reset();
CoreTiming::Shutdown(); CoreTiming::Shutdown();
app_loader = nullptr; app_loader.reset();
LOG_DEBUG(Core, "Shutdown OK"); LOG_DEBUG(Core, "Shutdown OK");
} }
Service::SM::ServiceManager& System::ServiceManager() {
return *service_manager;
}
const Service::SM::ServiceManager& System::ServiceManager() const {
return *service_manager;
}
} // namespace Core } // namespace Core

View file

@ -19,10 +19,16 @@
class EmuWindow; class EmuWindow;
class ARM_Interface; class ARM_Interface;
namespace Service::SM {
class ServiceManager;
}
namespace Core { namespace Core {
class System { class System {
public: public:
~System();
/** /**
* Gets the instance of the System singleton class. * Gets the instance of the System singleton class.
* @returns Reference to the instance of the System singleton class. * @returns Reference to the instance of the System singleton class.
@ -137,6 +143,9 @@ public:
return *app_loader; return *app_loader;
} }
Service::SM::ServiceManager& ServiceManager();
const Service::SM::ServiceManager& ServiceManager() const;
void SetGPUDebugContext(std::shared_ptr<Tegra::DebugContext> context) { void SetGPUDebugContext(std::shared_ptr<Tegra::DebugContext> context) {
debug_context = std::move(context); debug_context = std::move(context);
} }
@ -171,6 +180,9 @@ private:
/// When true, signals that a reschedule should happen /// When true, signals that a reschedule should happen
bool reschedule_pending{}; bool reschedule_pending{};
/// Service manager
std::shared_ptr<Service::SM::ServiceManager> service_manager;
/// Telemetry session for this emulation session /// Telemetry session for this emulation session
std::unique_ptr<Core::TelemetrySession> telemetry_session; std::unique_ptr<Core::TelemetrySession> telemetry_session;

View file

@ -145,7 +145,7 @@ ResultCode ServiceFrameworkBase::HandleSyncRequest(Kernel::HLERequestContext& co
return ResultCode(ErrorModule::HIPC, ErrorDescription::RemoteProcessDead); return ResultCode(ErrorModule::HIPC, ErrorDescription::RemoteProcessDead);
} }
case IPC::CommandType::Control: { case IPC::CommandType::Control: {
SM::g_service_manager->InvokeControlRequest(context); Core::System::GetInstance().ServiceManager().InvokeControlRequest(context);
break; break;
} }
case IPC::CommandType::Request: { case IPC::CommandType::Request: {
@ -170,42 +170,40 @@ void AddNamedPort(std::string name, SharedPtr<ClientPort> port) {
} }
/// Initialize ServiceManager /// Initialize ServiceManager
void Init() { void Init(std::shared_ptr<SM::ServiceManager>& sm) {
// NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it // NVFlinger needs to be accessed by several services like Vi and AppletOE so we instantiate it
// here and pass it into the respective InstallInterfaces functions. // here and pass it into the respective InstallInterfaces functions.
auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>(); auto nv_flinger = std::make_shared<NVFlinger::NVFlinger>();
SM::g_service_manager = std::make_shared<SM::ServiceManager>(); SM::ServiceManager::InstallInterfaces(sm);
SM::ServiceManager::InstallInterfaces(SM::g_service_manager);
Account::InstallInterfaces(*SM::g_service_manager); Account::InstallInterfaces(*sm);
AM::InstallInterfaces(*SM::g_service_manager, nv_flinger); AM::InstallInterfaces(*sm, nv_flinger);
AOC::InstallInterfaces(*SM::g_service_manager); AOC::InstallInterfaces(*sm);
APM::InstallInterfaces(*SM::g_service_manager); APM::InstallInterfaces(*sm);
Audio::InstallInterfaces(*SM::g_service_manager); Audio::InstallInterfaces(*sm);
Fatal::InstallInterfaces(*SM::g_service_manager); Fatal::InstallInterfaces(*sm);
FileSystem::InstallInterfaces(*SM::g_service_manager); FileSystem::InstallInterfaces(*sm);
Friend::InstallInterfaces(*SM::g_service_manager); Friend::InstallInterfaces(*sm);
HID::InstallInterfaces(*SM::g_service_manager); HID::InstallInterfaces(*sm);
LM::InstallInterfaces(*SM::g_service_manager); LM::InstallInterfaces(*sm);
NFP::InstallInterfaces(*SM::g_service_manager); NFP::InstallInterfaces(*sm);
NIFM::InstallInterfaces(*SM::g_service_manager); NIFM::InstallInterfaces(*sm);
NS::InstallInterfaces(*SM::g_service_manager); NS::InstallInterfaces(*sm);
Nvidia::InstallInterfaces(*SM::g_service_manager); Nvidia::InstallInterfaces(*sm);
PCTL::InstallInterfaces(*SM::g_service_manager); PCTL::InstallInterfaces(*sm);
Sockets::InstallInterfaces(*SM::g_service_manager); Sockets::InstallInterfaces(*sm);
SPL::InstallInterfaces(*SM::g_service_manager); SPL::InstallInterfaces(*sm);
SSL::InstallInterfaces(*SM::g_service_manager); SSL::InstallInterfaces(*sm);
Time::InstallInterfaces(*SM::g_service_manager); Time::InstallInterfaces(*sm);
VI::InstallInterfaces(*SM::g_service_manager, nv_flinger); VI::InstallInterfaces(*sm, nv_flinger);
Set::InstallInterfaces(*SM::g_service_manager); Set::InstallInterfaces(*sm);
LOG_DEBUG(Service, "initialized OK"); LOG_DEBUG(Service, "initialized OK");
} }
/// Shutdown ServiceManager /// Shutdown ServiceManager
void Shutdown() { void Shutdown() {
SM::g_service_manager = nullptr;
g_kernel_named_ports.clear(); g_kernel_named_ports.clear();
LOG_DEBUG(Service, "shutdown OK"); LOG_DEBUG(Service, "shutdown OK");
} }

View file

@ -178,7 +178,7 @@ private:
}; };
/// Initialize ServiceManager /// Initialize ServiceManager
void Init(); void Init(std::shared_ptr<SM::ServiceManager>& sm);
/// Shutdown ServiceManager /// Shutdown ServiceManager
void Shutdown(); void Shutdown();

View file

@ -14,6 +14,8 @@
namespace Service::SM { namespace Service::SM {
ServiceManager::~ServiceManager() = default;
void ServiceManager::InvokeControlRequest(Kernel::HLERequestContext& context) { void ServiceManager::InvokeControlRequest(Kernel::HLERequestContext& context) {
controller_interface->InvokeRequest(context); controller_interface->InvokeRequest(context);
} }
@ -72,7 +74,7 @@ ResultVal<Kernel::SharedPtr<Kernel::ClientSession>> ServiceManager::ConnectToSer
return client_port->Connect(); return client_port->Connect();
} }
std::shared_ptr<ServiceManager> g_service_manager; SM::~SM() = default;
/** /**
* SM::Initialize service function * SM::Initialize service function

View file

@ -23,7 +23,7 @@ namespace Service::SM {
class SM final : public ServiceFramework<SM> { class SM final : public ServiceFramework<SM> {
public: public:
SM(std::shared_ptr<ServiceManager> service_manager); SM(std::shared_ptr<ServiceManager> service_manager);
~SM() = default; ~SM() override;
private: private:
void Initialize(Kernel::HLERequestContext& ctx); void Initialize(Kernel::HLERequestContext& ctx);
@ -44,6 +44,8 @@ class ServiceManager {
public: public:
static void InstallInterfaces(std::shared_ptr<ServiceManager> self); static void InstallInterfaces(std::shared_ptr<ServiceManager> self);
~ServiceManager();
ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> RegisterService(std::string name, ResultVal<Kernel::SharedPtr<Kernel::ServerPort>> RegisterService(std::string name,
unsigned int max_sessions); unsigned int max_sessions);
ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name); ResultVal<Kernel::SharedPtr<Kernel::ClientPort>> GetServicePort(const std::string& name);
@ -59,6 +61,4 @@ private:
std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> registered_services; std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> registered_services;
}; };
extern std::shared_ptr<ServiceManager> g_service_manager;
} // namespace Service::SM } // namespace Service::SM