diff options
| author | 2016-06-14 18:03:30 -0500 | |
|---|---|---|
| committer | 2016-11-30 23:02:05 -0500 | |
| commit | 073653e858abf377fd1ebbdb071809c8830ce99d (patch) | |
| tree | a29e1c1e50d53162ed89cd90e8c069525150392f /src/core/hle/service/service.cpp | |
| parent | Merge pull request #2228 from freiro/winver_fix (diff) | |
| download | yuzu-073653e858abf377fd1ebbdb071809c8830ce99d.tar.gz yuzu-073653e858abf377fd1ebbdb071809c8830ce99d.tar.xz yuzu-073653e858abf377fd1ebbdb071809c8830ce99d.zip | |
Kernel/IPC: Use Ports and Sessions as the fundamental building block of Inter Process Communication.
All handles obtained via srv::GetServiceHandle or svcConnectToPort are references to ClientSessions.
Service modules will wait on the counterpart of those ClientSessions (Called ServerSessions) using svcReplyAndReceive or svcWaitSynchronization[1|N], and will be awoken when a SyncRequest is performed.
HLE Interfaces are now ClientPorts which override the HandleSyncRequest virtual member function to perform command handling immediately.
Diffstat (limited to 'src/core/hle/service/service.cpp')
| -rw-r--r-- | src/core/hle/service/service.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index ca7eeac8a..f51a042ff 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp | |||
| @@ -41,8 +41,8 @@ | |||
| 41 | 41 | ||
| 42 | namespace Service { | 42 | namespace Service { |
| 43 | 43 | ||
| 44 | std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_kernel_named_ports; | 44 | std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_kernel_named_ports; |
| 45 | std::unordered_map<std::string, Kernel::SharedPtr<Interface>> g_srv_services; | 45 | std::unordered_map<std::string, Kernel::SharedPtr<Kernel::ClientPort>> g_srv_services; |
| 46 | 46 | ||
| 47 | /** | 47 | /** |
| 48 | * Creates a function string for logging, complete with the name (or header code, depending | 48 | * Creates a function string for logging, complete with the name (or header code, depending |
| @@ -61,7 +61,7 @@ static std::string MakeFunctionString(const char* name, const char* port_name, | |||
| 61 | return function_string; | 61 | return function_string; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | ResultVal<bool> Interface::SyncRequest() { | 64 | ResultCode Interface::HandleSyncRequest() { |
| 65 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 65 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 66 | auto itr = m_functions.find(cmd_buff[0]); | 66 | auto itr = m_functions.find(cmd_buff[0]); |
| 67 | 67 | ||
| @@ -75,14 +75,14 @@ ResultVal<bool> Interface::SyncRequest() { | |||
| 75 | 75 | ||
| 76 | // TODO(bunnei): Hack - ignore error | 76 | // TODO(bunnei): Hack - ignore error |
| 77 | cmd_buff[1] = 0; | 77 | cmd_buff[1] = 0; |
| 78 | return MakeResult<bool>(false); | 78 | return RESULT_SUCCESS; |
| 79 | } | 79 | } |
| 80 | LOG_TRACE(Service, "%s", | 80 | LOG_TRACE(Service, "%s", |
| 81 | MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); | 81 | MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); |
| 82 | 82 | ||
| 83 | itr->second.func(this); | 83 | itr->second.func(this); |
| 84 | 84 | ||
| 85 | return MakeResult<bool>(false); // TODO: Implement return from actual function | 85 | return RESULT_SUCCESS; // TODO: Implement return from actual function, it should fail if the parameter translation fails |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | void Interface::Register(const FunctionInfo* functions, size_t n) { | 88 | void Interface::Register(const FunctionInfo* functions, size_t n) { |
| @@ -97,10 +97,16 @@ void Interface::Register(const FunctionInfo* functions, size_t n) { | |||
| 97 | // Module interface | 97 | // Module interface |
| 98 | 98 | ||
| 99 | static void AddNamedPort(Interface* interface_) { | 99 | static void AddNamedPort(Interface* interface_) { |
| 100 | interface_->name = interface_->GetPortName(); | ||
| 101 | interface_->active_sessions = 0; | ||
| 102 | interface_->max_sessions = interface_->GetMaxSessions(); | ||
| 100 | g_kernel_named_ports.emplace(interface_->GetPortName(), interface_); | 103 | g_kernel_named_ports.emplace(interface_->GetPortName(), interface_); |
| 101 | } | 104 | } |
| 102 | 105 | ||
| 103 | void AddService(Interface* interface_) { | 106 | void AddService(Interface* interface_) { |
| 107 | interface_->name = interface_->GetPortName(); | ||
| 108 | interface_->active_sessions = 0; | ||
| 109 | interface_->max_sessions = interface_->GetMaxSessions(); | ||
| 104 | g_srv_services.emplace(interface_->GetPortName(), interface_); | 110 | g_srv_services.emplace(interface_->GetPortName(), interface_); |
| 105 | } | 111 | } |
| 106 | 112 | ||