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/svc.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/svc.cpp')
| -rw-r--r-- | src/core/hle/svc.cpp | 18 |
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 |
| 230 | static ResultCode SendSyncRequest(Handle handle) { | 242 | static 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 |