summaryrefslogtreecommitdiff
path: root/src/core/hle/svc.cpp
diff options
context:
space:
mode:
authorGravatar Subv2016-06-14 18:03:30 -0500
committerGravatar Subv2016-11-30 23:02:05 -0500
commit073653e858abf377fd1ebbdb071809c8830ce99d (patch)
treea29e1c1e50d53162ed89cd90e8c069525150392f /src/core/hle/svc.cpp
parentMerge pull request #2228 from freiro/winver_fix (diff)
downloadyuzu-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/svc.cpp')
-rw-r--r--src/core/hle/svc.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/core/hle/svc.cpp b/src/core/hle/svc.cpp
index c6b80dc50..be03e53bc 100644
--- a/src/core/hle/svc.cpp
+++ b/src/core/hle/svc.cpp
@@ -13,6 +13,7 @@
13#include "core/hle/function_wrappers.h" 13#include "core/hle/function_wrappers.h"
14#include "core/hle/kernel/address_arbiter.h" 14#include "core/hle/kernel/address_arbiter.h"
15#include "core/hle/kernel/client_port.h" 15#include "core/hle/kernel/client_port.h"
16#include "core/hle/kernel/client_session.h"
16#include "core/hle/kernel/event.h" 17#include "core/hle/kernel/event.h"
17#include "core/hle/kernel/memory.h" 18#include "core/hle/kernel/memory.h"
18#include "core/hle/kernel/mutex.h" 19#include "core/hle/kernel/mutex.h"
@@ -222,20 +223,31 @@ static ResultCode ConnectToPort(Handle* out_handle, const char* port_name) {
222 return ERR_NOT_FOUND; 223 return ERR_NOT_FOUND;
223 } 224 }
224 225
225 CASCADE_RESULT(*out_handle, Kernel::g_handle_table.Create(it->second)); 226 auto client_port = it->second;
227
228 // Create a new session pair
229 auto sessions = Kernel::ServerSession::CreateSessionPair(client_port, port_name);
230 auto client_session = std::get<Kernel::SharedPtr<Kernel::ClientSession>>(sessions);
231 auto server_session = std::get<Kernel::SharedPtr<Kernel::ServerSession>>(sessions);
232
233 // Add the server session to the port's queue
234 client_port->AddWaitingSession(server_session);
235
236 // Return the client session
237 CASCADE_RESULT(*out_handle, Kernel::g_handle_table.Create(client_session));
226 return RESULT_SUCCESS; 238 return RESULT_SUCCESS;
227} 239}
228 240
229/// Synchronize to an OS service 241/// Synchronize to an OS service
230static ResultCode SendSyncRequest(Handle handle) { 242static ResultCode SendSyncRequest(Handle handle) {
231 SharedPtr<Kernel::Session> session = Kernel::g_handle_table.Get<Kernel::Session>(handle); 243 SharedPtr<Kernel::ClientSession> session = Kernel::g_handle_table.Get<Kernel::ClientSession>(handle);
232 if (session == nullptr) { 244 if (session == nullptr) {
233 return ERR_INVALID_HANDLE; 245 return ERR_INVALID_HANDLE;
234 } 246 }
235 247
236 LOG_TRACE(Kernel_SVC, "called handle=0x%08X(%s)", handle, session->GetName().c_str()); 248 LOG_TRACE(Kernel_SVC, "called handle=0x%08X(%s)", handle, session->GetName().c_str());
237 249
238 return session->SyncRequest().Code(); 250 return session->HandleSyncRequest();
239} 251}
240 252
241/// Close a handle 253/// Close a handle