diff options
| author | 2018-01-22 21:37:15 -0500 | |
|---|---|---|
| committer | 2018-01-22 21:37:15 -0500 | |
| commit | d1b64cdc070c02b63398803136c04d4fe8bd0df0 (patch) | |
| tree | e41a908d37931f4a0de99f5fbe13cbb1f8a6f32c /src | |
| parent | Merge pull request #133 from Subv/nvflinger2 (diff) | |
| parent | Services: Added a todo about returning interfaces as domain objects in lm, hi... (diff) | |
| download | yuzu-d1b64cdc070c02b63398803136c04d4fe8bd0df0.tar.gz yuzu-d1b64cdc070c02b63398803136c04d4fe8bd0df0.tar.xz yuzu-d1b64cdc070c02b63398803136c04d4fe8bd0df0.zip | |
Merge pull request #135 from Subv/no_ports
IPC: Don't create unnecessary ports when returning sub interfaces.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/ipc_helpers.h | 9 | ||||
| -rw-r--r-- | src/core/hle/service/hid/hid.cpp | 29 | ||||
| -rw-r--r-- | src/core/hle/service/lm/lm.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/service/lm/lm.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/time/time.cpp | 66 |
5 files changed, 67 insertions, 65 deletions
diff --git a/src/core/hle/ipc_helpers.h b/src/core/hle/ipc_helpers.h index a27cfbc2d..ab479b49b 100644 --- a/src/core/hle/ipc_helpers.h +++ b/src/core/hle/ipc_helpers.h | |||
| @@ -118,10 +118,11 @@ public: | |||
| 118 | if (context->IsDomain()) { | 118 | if (context->IsDomain()) { |
| 119 | context->AddDomainObject(std::move(iface)); | 119 | context->AddDomainObject(std::move(iface)); |
| 120 | } else { | 120 | } else { |
| 121 | auto port = iface->CreatePort(); | 121 | auto sessions = Kernel::ServerSession::CreateSessionPair(iface->GetServiceName()); |
| 122 | auto session = port->Connect(); | 122 | auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |
| 123 | ASSERT(session.Succeeded()); | 123 | auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); |
| 124 | context->AddMoveObject(std::move(session).Unwrap()); | 124 | iface->ClientConnected(server); |
| 125 | context->AddMoveObject(std::move(client)); | ||
| 125 | } | 126 | } |
| 126 | } | 127 | } |
| 127 | 128 | ||
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp index d99e9c505..ae60cc7b4 100644 --- a/src/core/hle/service/hid/hid.cpp +++ b/src/core/hle/service/hid/hid.cpp | |||
| @@ -162,23 +162,26 @@ public: | |||
| 162 | ~Hid() = default; | 162 | ~Hid() = default; |
| 163 | 163 | ||
| 164 | private: | 164 | private: |
| 165 | Kernel::SharedPtr<Kernel::ClientPort> client_port; | 165 | std::shared_ptr<IAppletResource> applet_resource; |
| 166 | 166 | ||
| 167 | void CreateAppletResource(Kernel::HLERequestContext& ctx) { | 167 | void CreateAppletResource(Kernel::HLERequestContext& ctx) { |
| 168 | if (client_port == nullptr) { | 168 | if (applet_resource == nullptr) { |
| 169 | client_port = std::make_shared<IAppletResource>()->CreatePort(); | 169 | applet_resource = std::make_shared<IAppletResource>(); |
| 170 | } | 170 | } |
| 171 | 171 | ||
| 172 | auto session = client_port->Connect(); | 172 | // TODO(Subv): Verify if this should return the interface as a domain object when called |
| 173 | if (session.Succeeded()) { | 173 | // from within a domain. |
| 174 | LOG_DEBUG(Service, "called, initialized IAppletResource -> session=%u", | 174 | |
| 175 | (*session)->GetObjectId()); | 175 | auto sessions = Kernel::ServerSession::CreateSessionPair(applet_resource->GetServiceName()); |
| 176 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | 176 | auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |
| 177 | rb.Push(RESULT_SUCCESS); | 177 | auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); |
| 178 | rb.PushMoveObjects(std::move(session).Unwrap()); | 178 | applet_resource->ClientConnected(server); |
| 179 | } else { | 179 | |
| 180 | UNIMPLEMENTED(); | 180 | LOG_DEBUG(Service, "called, initialized IAppletResource -> session=%u", |
| 181 | } | 181 | client->GetObjectId()); |
| 182 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | ||
| 183 | rb.Push(RESULT_SUCCESS); | ||
| 184 | rb.PushMoveObjects(std::move(client)); | ||
| 182 | } | 185 | } |
| 183 | }; | 186 | }; |
| 184 | 187 | ||
diff --git a/src/core/hle/service/lm/lm.cpp b/src/core/hle/service/lm/lm.cpp index 13c9ee3d3..b505cdcaf 100644 --- a/src/core/hle/service/lm/lm.cpp +++ b/src/core/hle/service/lm/lm.cpp | |||
| @@ -146,18 +146,19 @@ void InstallInterfaces(SM::ServiceManager& service_manager) { | |||
| 146 | * 0: ResultCode | 146 | * 0: ResultCode |
| 147 | */ | 147 | */ |
| 148 | void LM::Initialize(Kernel::HLERequestContext& ctx) { | 148 | void LM::Initialize(Kernel::HLERequestContext& ctx) { |
| 149 | auto client_port = std::make_shared<Logger>()->CreatePort(); | 149 | // TODO(Subv): Verify if this should return the interface as a domain object when called from |
| 150 | auto session = client_port->Connect(); | 150 | // within a domain. |
| 151 | if (session.Succeeded()) { | 151 | |
| 152 | LOG_DEBUG(Service_SM, "called, initialized logger -> session=%u", | 152 | auto logger = std::make_shared<Logger>(); |
| 153 | (*session)->GetObjectId()); | 153 | auto sessions = Kernel::ServerSession::CreateSessionPair(logger->GetServiceName()); |
| 154 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | 154 | auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |
| 155 | rb.Push(RESULT_SUCCESS); | 155 | auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); |
| 156 | rb.PushMoveObjects(std::move(session).Unwrap()); | 156 | logger->ClientConnected(server); |
| 157 | registered_loggers.emplace_back(std::move(client_port)); | 157 | |
| 158 | } else { | 158 | LOG_DEBUG(Service_SM, "called, initialized logger -> session=%u", client->GetObjectId()); |
| 159 | UNIMPLEMENTED(); | 159 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; |
| 160 | } | 160 | rb.Push(RESULT_SUCCESS); |
| 161 | rb.PushMoveObjects(std::move(client)); | ||
| 161 | 162 | ||
| 162 | LOG_INFO(Service_SM, "called"); | 163 | LOG_INFO(Service_SM, "called"); |
| 163 | } | 164 | } |
diff --git a/src/core/hle/service/lm/lm.h b/src/core/hle/service/lm/lm.h index 4b954bdb2..371135057 100644 --- a/src/core/hle/service/lm/lm.h +++ b/src/core/hle/service/lm/lm.h | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <vector> | 7 | #include <vector> |
| 8 | #include "core/hle/kernel/client_port.h" | ||
| 9 | #include "core/hle/kernel/kernel.h" | 8 | #include "core/hle/kernel/kernel.h" |
| 10 | #include "core/hle/service/service.h" | 9 | #include "core/hle/service/service.h" |
| 11 | 10 | ||
| @@ -19,8 +18,6 @@ public: | |||
| 19 | 18 | ||
| 20 | private: | 19 | private: |
| 21 | void Initialize(Kernel::HLERequestContext& ctx); | 20 | void Initialize(Kernel::HLERequestContext& ctx); |
| 22 | |||
| 23 | std::vector<Kernel::SharedPtr<Kernel::ClientPort>> registered_loggers; | ||
| 24 | }; | 21 | }; |
| 25 | 22 | ||
| 26 | /// Registers all LM services with the specified service manager. | 23 | /// Registers all LM services with the specified service manager. |
diff --git a/src/core/hle/service/time/time.cpp b/src/core/hle/service/time/time.cpp index 9fed89246..8abb2ce7a 100644 --- a/src/core/hle/service/time/time.cpp +++ b/src/core/hle/service/time/time.cpp | |||
| @@ -83,45 +83,45 @@ private: | |||
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | void Module::Interface::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { | 85 | void Module::Interface::GetStandardUserSystemClock(Kernel::HLERequestContext& ctx) { |
| 86 | auto client_port = std::make_shared<ISystemClock>()->CreatePort(); | 86 | // TODO(Subv): Verify if this should return the interface as a domain object when called from |
| 87 | auto session = client_port->Connect(); | 87 | // within a domain. |
| 88 | if (session.Succeeded()) { | 88 | auto system_clock = std::make_shared<ISystemClock>(); |
| 89 | LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", | 89 | auto sessions = Kernel::ServerSession::CreateSessionPair(system_clock->GetServiceName()); |
| 90 | (*session)->GetObjectId()); | 90 | auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |
| 91 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | 91 | auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); |
| 92 | rb.Push(RESULT_SUCCESS); | 92 | system_clock->ClientConnected(server); |
| 93 | rb.PushMoveObjects(std::move(session).Unwrap()); | 93 | LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", client->GetObjectId()); |
| 94 | } else { | 94 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; |
| 95 | UNIMPLEMENTED(); | 95 | rb.Push(RESULT_SUCCESS); |
| 96 | } | 96 | rb.PushMoveObjects(std::move(client)); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | void Module::Interface::GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx) { | 99 | void Module::Interface::GetStandardNetworkSystemClock(Kernel::HLERequestContext& ctx) { |
| 100 | auto client_port = std::make_shared<ISystemClock>()->CreatePort(); | 100 | // TODO(Subv): Verify if this should return the interface as a domain object when called from |
| 101 | auto session = client_port->Connect(); | 101 | // within a domain. |
| 102 | if (session.Succeeded()) { | 102 | auto system_clock = std::make_shared<ISystemClock>(); |
| 103 | LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", | 103 | auto sessions = Kernel::ServerSession::CreateSessionPair(system_clock->GetServiceName()); |
| 104 | (*session)->GetObjectId()); | 104 | auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |
| 105 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | 105 | auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); |
| 106 | rb.Push(RESULT_SUCCESS); | 106 | system_clock->ClientConnected(server); |
| 107 | rb.PushMoveObjects(std::move(session).Unwrap()); | 107 | LOG_DEBUG(Service, "called, initialized ISystemClock -> session=%u", client->GetObjectId()); |
| 108 | } else { | 108 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; |
| 109 | UNIMPLEMENTED(); | 109 | rb.Push(RESULT_SUCCESS); |
| 110 | } | 110 | rb.PushMoveObjects(std::move(client)); |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | void Module::Interface::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) { | 113 | void Module::Interface::GetStandardSteadyClock(Kernel::HLERequestContext& ctx) { |
| 114 | auto client_port = std::make_shared<ISteadyClock>()->CreatePort(); | 114 | // TODO(Subv): Verify if this should return the interface as a domain object when called from |
| 115 | auto session = client_port->Connect(); | 115 | // within a domain. |
| 116 | if (session.Succeeded()) { | 116 | auto steady_clock = std::make_shared<ISteadyClock>(); |
| 117 | LOG_DEBUG(Service, "called, initialized ISteadyClock -> session=%u", | 117 | auto sessions = Kernel::ServerSession::CreateSessionPair(steady_clock->GetServiceName()); |
| 118 | (*session)->GetObjectId()); | 118 | auto server = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions); |
| 119 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; | 119 | auto client = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions); |
| 120 | rb.Push(RESULT_SUCCESS); | 120 | steady_clock->ClientConnected(server); |
| 121 | rb.PushMoveObjects(std::move(session).Unwrap()); | 121 | LOG_DEBUG(Service, "called, initialized ISteadyClock -> session=%u", client->GetObjectId()); |
| 122 | } else { | 122 | IPC::RequestBuilder rb{ctx, 2, 0, 1}; |
| 123 | UNIMPLEMENTED(); | 123 | rb.Push(RESULT_SUCCESS); |
| 124 | } | 124 | rb.PushMoveObjects(std::move(client)); |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) { | 127 | void Module::Interface::GetTimeZoneService(Kernel::HLERequestContext& ctx) { |