summaryrefslogtreecommitdiff
path: root/src/core/hle/service/service.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/hle/service/service.cpp')
-rw-r--r--src/core/hle/service/service.cpp28
1 files changed, 10 insertions, 18 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index e6605a398..08d0c43ff 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -7,12 +7,15 @@
7#include "common/string_util.h" 7#include "common/string_util.h"
8 8
9#include "core/hle/hle.h" 9#include "core/hle/hle.h"
10
10#include "core/hle/service/service.h" 11#include "core/hle/service/service.h"
11#include "core/hle/service/apt.h" 12#include "core/hle/service/apt.h"
12#include "core/hle/service/gsp.h" 13#include "core/hle/service/gsp.h"
13#include "core/hle/service/hid.h" 14#include "core/hle/service/hid.h"
14#include "core/hle/service/srv.h" 15#include "core/hle/service/srv.h"
15 16
17#include "core/hle/kernel/kernel.h"
18
16namespace Service { 19namespace Service {
17 20
18Manager* g_manager = NULL; ///< Service manager 21Manager* g_manager = NULL; ///< Service manager
@@ -31,32 +34,21 @@ Manager::~Manager() {
31 34
32/// Add a service to the manager (does not create it though) 35/// Add a service to the manager (does not create it though)
33void Manager::AddService(Interface* service) { 36void Manager::AddService(Interface* service) {
34 int index = m_services.size(); 37 m_port_map[service->GetPortName()] = Kernel::g_object_pool.Create(service);
35 u32 new_uid = GetUIDFromIndex(index);
36
37 m_services.push_back(service); 38 m_services.push_back(service);
38
39 m_port_map[service->GetPortName()] = new_uid;
40 service->m_uid = new_uid;
41} 39}
42 40
43/// Removes a service from the manager, also frees memory 41/// Removes a service from the manager, also frees memory
44void Manager::DeleteService(std::string port_name) { 42void Manager::DeleteService(std::string port_name) {
45 auto service = FetchFromPortName(port_name); 43 Interface* service = FetchFromPortName(port_name);
46 44 m_services.erase(std::remove(m_services.begin(), m_services.end(), service), m_services.end());
47 m_services.erase(m_services.begin() + GetIndexFromUID(service->m_uid));
48 m_port_map.erase(port_name); 45 m_port_map.erase(port_name);
49
50 delete service; 46 delete service;
51} 47}
52 48
53/// Get a Service Interface from its UID 49/// Get a Service Interface from its Handle
54Interface* Manager::FetchFromUID(u32 uid) { 50Interface* Manager::FetchFromHandle(Handle handle) {
55 int index = GetIndexFromUID(uid); 51 return Kernel::g_object_pool.GetFast<Interface>(handle);
56 if (index < (int)m_services.size()) {
57 return m_services[index];
58 }
59 return NULL;
60} 52}
61 53
62/// Get a Service Interface from its port 54/// Get a Service Interface from its port
@@ -65,7 +57,7 @@ Interface* Manager::FetchFromPortName(std::string port_name) {
65 if (itr == m_port_map.end()) { 57 if (itr == m_port_map.end()) {
66 return NULL; 58 return NULL;
67 } 59 }
68 return FetchFromUID(itr->second); 60 return FetchFromHandle(itr->second);
69} 61}
70 62
71 63