summaryrefslogtreecommitdiff
path: root/src/core/hle/service/service.cpp
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2016-12-14 20:35:33 -0800
committerGravatar GitHub2016-12-14 20:35:33 -0800
commit905fc92ce1f7d99d8819a17b180a559b3a9f15de (patch)
treecc992764c2ea065d8d30dce2055cc1efe167bc59 /src/core/hle/service/service.cpp
parentMerge pull request #2166 from endrift/clang-detect (diff)
parentFixed the codestyle to match our clang-format rules. (diff)
downloadyuzu-905fc92ce1f7d99d8819a17b180a559b3a9f15de.tar.gz
yuzu-905fc92ce1f7d99d8819a17b180a559b3a9f15de.tar.xz
yuzu-905fc92ce1f7d99d8819a17b180a559b3a9f15de.zip
Merge pull request #2249 from Subv/sessions_v3
Kernel/IPC: Use Ports and Sessions as the fundamental building block of Inter Process Communication.
Diffstat (limited to 'src/core/hle/service/service.cpp')
-rw-r--r--src/core/hle/service/service.cpp42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp
index effecc043..2bc3fdc82 100644
--- a/src/core/hle/service/service.cpp
+++ b/src/core/hle/service/service.cpp
@@ -2,8 +2,12 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <boost/range/algorithm_ext/erase.hpp>
6
5#include "common/logging/log.h" 7#include "common/logging/log.h"
6#include "common/string_util.h" 8#include "common/string_util.h"
9
10#include "core/hle/kernel/server_port.h"
7#include "core/hle/service/ac_u.h" 11#include "core/hle/service/ac_u.h"
8#include "core/hle/service/act_a.h" 12#include "core/hle/service/act_a.h"
9#include "core/hle/service/act_u.h" 13#include "core/hle/service/act_u.h"
@@ -44,8 +48,8 @@
44 48
45namespace Service { 49namespace Service {
46 50
47std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_kernel_named_ports; 51std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_kernel_named_ports;
48std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services; 52std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_srv_services;
49 53
50/** 54/**
51 * Creates a function string for logging, complete with the name (or header code, depending 55 * Creates a function string for logging, complete with the name (or header code, depending
@@ -64,7 +68,23 @@ static std::string MakeFunctionString(const char* name, const char* port_name,
64 return function_string; 68 return function_string;
65} 69}
66 70
67ResultVal<bool> Interface::SyncRequest() { 71void SessionRequestHandler::ClientConnected(
72 Kernel::SharedPtr<Kernel::ServerSession> server_session) {
73 connected_sessions.push_back(server_session);
74}
75
76void SessionRequestHandler::ClientDisconnected(
77 Kernel::SharedPtr<Kernel::ServerSession> server_session) {
78 boost::range::remove_erase(connected_sessions, server_session);
79}
80
81Interface::Interface(u32 max_sessions) : max_sessions(max_sessions) {}
82Interface::~Interface() = default;
83
84void Interface::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) {
85 // TODO(Subv): Make use of the server_session in the HLE service handlers to distinguish which
86 // session triggered each command.
87
68 u32* cmd_buff = Kernel::GetCommandBuffer(); 88 u32* cmd_buff = Kernel::GetCommandBuffer();
69 auto itr = m_functions.find(cmd_buff[0]); 89 auto itr = m_functions.find(cmd_buff[0]);
70 90
@@ -78,14 +98,12 @@ ResultVal<bool> Interface::SyncRequest() {
78 98
79 // TODO(bunnei): Hack - ignore error 99 // TODO(bunnei): Hack - ignore error
80 cmd_buff[1] = 0; 100 cmd_buff[1] = 0;
81 return MakeResult<bool>(false); 101 return;
82 } 102 }
83 LOG_TRACE(Service, "%s", 103 LOG_TRACE(Service, "%s",
84 MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); 104 MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str());
85 105
86 itr->second.func(this); 106 itr->second.func(this);
87
88 return MakeResult<bool>(false); // TODO: Implement return from actual function
89} 107}
90 108
91void Interface::Register(const FunctionInfo* functions, size_t n) { 109void Interface::Register(const FunctionInfo* functions, size_t n) {
@@ -100,11 +118,19 @@ void Interface::Register(const FunctionInfo* functions, size_t n) {
100// Module interface 118// Module interface
101 119
102static void AddNamedPort(Interface* interface_) { 120static void AddNamedPort(Interface* interface_) {
103 g_kernel_named_ports.emplace(interface_->GetPortName(), interface_); 121 auto ports =
122 Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(),
123 std::shared_ptr<Interface>(interface_));
124 auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports);
125 g_kernel_named_ports.emplace(interface_->GetPortName(), std::move(client_port));
104} 126}
105 127
106void AddService(Interface* interface_) { 128void AddService(Interface* interface_) {
107 g_srv_services.emplace(interface_->GetPortName(), interface_); 129 auto ports =
130 Kernel::ServerPort::CreatePortPair(interface_->GetMaxSessions(), interface_->GetPortName(),
131 std::shared_ptr<Interface>(interface_));
132 auto client_port = std::get<Kernel::SharedPtr<Kernel::ClientPort>>(ports);
133 g_srv_services.emplace(interface_->GetPortName(), std::move(client_port));
108} 134}
109 135
110/// Initialize ServiceManager 136/// Initialize ServiceManager