diff options
Diffstat (limited to 'src/core/hle/service/service.cpp')
| -rw-r--r-- | src/core/hle/service/service.cpp | 130 |
1 files changed, 55 insertions, 75 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index 355196fd3..e0979ea5d 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -54,96 +54,76 @@ | |||
| 54 | 54 | ||
| 55 | namespace Service { | 55 | namespace Service { |
| 56 | 56 | ||
| 57 | Manager* g_manager = nullptr; ///< Service manager | 57 | std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_kernel_named_ports; |
| 58 | std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services; | ||
| 58 | 59 | ||
| 59 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 60 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
| 60 | // Service Manager class | 61 | // Module interface |
| 61 | |||
| 62 | void Manager::AddService(Interface* service) { | ||
| 63 | // TOOD(yuriks): Fix error reporting | ||
| 64 | m_port_map[service->GetPortName()] = Kernel::g_handle_table.Create(service).ValueOr(INVALID_HANDLE); | ||
| 65 | m_services.push_back(service); | ||
| 66 | } | ||
| 67 | |||
| 68 | void Manager::DeleteService(const std::string& port_name) { | ||
| 69 | Interface* service = FetchFromPortName(port_name); | ||
| 70 | m_services.erase(std::remove(m_services.begin(), m_services.end(), service), m_services.end()); | ||
| 71 | m_port_map.erase(port_name); | ||
| 72 | } | ||
| 73 | 62 | ||
| 74 | Interface* Manager::FetchFromHandle(Handle handle) { | 63 | static void AddNamedPort(Interface* interface) { |
| 75 | // TODO(yuriks): This function is very suspicious and should probably be exterminated. | 64 | g_kernel_named_ports.emplace(interface->GetPortName(), interface); |
| 76 | return Kernel::g_handle_table.Get<Interface>(handle).get(); | ||
| 77 | } | 65 | } |
| 78 | 66 | ||
| 79 | Interface* Manager::FetchFromPortName(const std::string& port_name) { | 67 | static void AddService(Interface* interface) { |
| 80 | auto itr = m_port_map.find(port_name); | 68 | g_srv_services.emplace(interface->GetPortName(), interface); |
| 81 | if (itr == m_port_map.end()) { | ||
| 82 | return nullptr; | ||
| 83 | } | ||
| 84 | return FetchFromHandle(itr->second); | ||
| 85 | } | 69 | } |
| 86 | 70 | ||
| 87 | |||
| 88 | //////////////////////////////////////////////////////////////////////////////////////////////////// | ||
| 89 | // Module interface | ||
| 90 | |||
| 91 | /// Initialize ServiceManager | 71 | /// Initialize ServiceManager |
| 92 | void Init() { | 72 | void Init() { |
| 93 | g_manager = new Manager; | 73 | AddNamedPort(new SRV::Interface); |
| 94 | 74 | ||
| 95 | g_manager->AddService(new SRV::Interface); | 75 | AddService(new AC_U::Interface); |
| 96 | g_manager->AddService(new AC_U::Interface); | 76 | AddService(new ACT_U::Interface); |
| 97 | g_manager->AddService(new ACT_U::Interface); | 77 | AddService(new AM_APP::Interface); |
| 98 | g_manager->AddService(new AM_APP::Interface); | 78 | AddService(new AM_NET::Interface); |
| 99 | g_manager->AddService(new AM_NET::Interface); | 79 | AddService(new AM_SYS::Interface); |
| 100 | g_manager->AddService(new AM_SYS::Interface); | 80 | AddService(new APT_A::Interface); |
| 101 | g_manager->AddService(new APT_A::Interface); | 81 | AddService(new APT_S::Interface); |
| 102 | g_manager->AddService(new APT_S::Interface); | 82 | AddService(new APT_U::Interface); |
| 103 | g_manager->AddService(new APT_U::Interface); | 83 | AddService(new BOSS_P::Interface); |
| 104 | g_manager->AddService(new BOSS_P::Interface); | 84 | AddService(new BOSS_U::Interface); |
| 105 | g_manager->AddService(new BOSS_U::Interface); | 85 | AddService(new CAM_U::Interface); |
| 106 | g_manager->AddService(new CAM_U::Interface); | 86 | AddService(new CECD_S::Interface); |
| 107 | g_manager->AddService(new CECD_S::Interface); | 87 | AddService(new CECD_U::Interface); |
| 108 | g_manager->AddService(new CECD_U::Interface); | 88 | AddService(new CFG_I::Interface); |
| 109 | g_manager->AddService(new CFG_I::Interface); | 89 | AddService(new CFG_S::Interface); |
| 110 | g_manager->AddService(new CFG_S::Interface); | 90 | AddService(new CFG_U::Interface); |
| 111 | g_manager->AddService(new CFG_U::Interface); | 91 | AddService(new CSND_SND::Interface); |
| 112 | g_manager->AddService(new CSND_SND::Interface); | 92 | AddService(new DSP_DSP::Interface); |
| 113 | g_manager->AddService(new DSP_DSP::Interface); | 93 | AddService(new ERR_F::Interface); |
| 114 | g_manager->AddService(new ERR_F::Interface); | 94 | AddService(new FRD_A::Interface); |
| 115 | g_manager->AddService(new FRD_A::Interface); | 95 | AddService(new FRD_U::Interface); |
| 116 | g_manager->AddService(new FRD_U::Interface); | 96 | AddService(new FS::FSUserInterface); |
| 117 | g_manager->AddService(new FS::FSUserInterface); | 97 | AddService(new GSP_GPU::Interface); |
| 118 | g_manager->AddService(new GSP_GPU::Interface); | 98 | AddService(new GSP_LCD::Interface); |
| 119 | g_manager->AddService(new GSP_LCD::Interface); | 99 | AddService(new HID_User::Interface); |
| 120 | g_manager->AddService(new HID_User::Interface); | 100 | AddService(new HID_SPVR::Interface); |
| 121 | g_manager->AddService(new HID_SPVR::Interface); | 101 | AddService(new HTTP_C::Interface); |
| 122 | g_manager->AddService(new HTTP_C::Interface); | 102 | AddService(new IR_RST::Interface); |
| 123 | g_manager->AddService(new IR_RST::Interface); | 103 | AddService(new IR_U::Interface); |
| 124 | g_manager->AddService(new IR_U::Interface); | 104 | AddService(new LDR_RO::Interface); |
| 125 | g_manager->AddService(new LDR_RO::Interface); | 105 | AddService(new MIC_U::Interface); |
| 126 | g_manager->AddService(new MIC_U::Interface); | 106 | AddService(new NDM_U::Interface); |
| 127 | g_manager->AddService(new NDM_U::Interface); | 107 | AddService(new NEWS_S::Interface); |
| 128 | g_manager->AddService(new NEWS_S::Interface); | 108 | AddService(new NEWS_U::Interface); |
| 129 | g_manager->AddService(new NEWS_U::Interface); | 109 | AddService(new NIM_AOC::Interface); |
| 130 | g_manager->AddService(new NIM_AOC::Interface); | 110 | AddService(new NS_S::Interface); |
| 131 | g_manager->AddService(new NS_S::Interface); | 111 | AddService(new NWM_UDS::Interface); |
| 132 | g_manager->AddService(new NWM_UDS::Interface); | 112 | AddService(new PM_APP::Interface); |
| 133 | g_manager->AddService(new PM_APP::Interface); | 113 | AddService(new PTM_PLAY::Interface); |
| 134 | g_manager->AddService(new PTM_PLAY::Interface); | 114 | AddService(new PTM_U::Interface); |
| 135 | g_manager->AddService(new PTM_U::Interface); | 115 | AddService(new PTM_SYSM::Interface); |
| 136 | g_manager->AddService(new PTM_SYSM::Interface); | 116 | AddService(new SOC_U::Interface); |
| 137 | g_manager->AddService(new SOC_U::Interface); | 117 | AddService(new SSL_C::Interface); |
| 138 | g_manager->AddService(new SSL_C::Interface); | 118 | AddService(new Y2R_U::Interface); |
| 139 | g_manager->AddService(new Y2R_U::Interface); | ||
| 140 | 119 | ||
| 141 | LOG_DEBUG(Service, "initialized OK"); | 120 | LOG_DEBUG(Service, "initialized OK"); |
| 142 | } | 121 | } |
| 143 | 122 | ||
| 144 | /// Shutdown ServiceManager | 123 | /// Shutdown ServiceManager |
| 145 | void Shutdown() { | 124 | void Shutdown() { |
| 146 | delete g_manager; | 125 | g_srv_services.clear(); |
| 126 | g_kernel_named_ports.clear(); | ||
| 147 | LOG_DEBUG(Service, "shutdown OK"); | 127 | LOG_DEBUG(Service, "shutdown OK"); |
| 148 | } | 128 | } |
| 149 | 129 | ||