diff options
| author | Subv <subv2112@gmail.com> | 2016-06-14 18:03:30 -0500 |
|---|---|---|
| committer | Subv <subv2112@gmail.com> | 2016-11-30 23:02:05 -0500 |
| commit | 073653e858abf377fd1ebbdb071809c8830ce99d (patch) | |
| tree | a29e1c1e50d53162ed89cd90e8c069525150392f /src/core/hle/kernel/client_session.cpp | |
| parent | 68c00ee771791e5975912c4e0d4be0fb5ab6b8fa (diff) | |
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/kernel/client_session.cpp')
| -rw-r--r-- | src/core/hle/kernel/client_session.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp new file mode 100644 index 000000000..f1ad9b65b --- /dev/null +++ b/src/core/hle/kernel/client_session.cpp @@ -0,0 +1,42 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "common/assert.h" + +#include "core/hle/kernel/client_port.h" +#include "core/hle/kernel/client_session.h" +#include "core/hle/kernel/server_session.h" +#include "core/hle/kernel/kernel.h" + +namespace Kernel { + +ClientSession::ClientSession() {} +ClientSession::~ClientSession() {} + +ResultVal<SharedPtr<ClientSession>> ClientSession::Create(SharedPtr<ServerSession> server_session, SharedPtr<ClientPort> client_port, std::string name) { + SharedPtr<ClientSession> client_session(new ClientSession); + + client_session->name = std::move(name); + client_session->server_session = server_session; + client_session->client_port = client_port; + + return MakeResult<SharedPtr<ClientSession>>(std::move(client_session)); +} + +ResultCode ClientSession::HandleSyncRequest() { + // Signal the server session that new data is available + ResultCode result = server_session->HandleSyncRequest(); + + if (result.IsError()) + return result; + + // Tell the client port to handle the request in case it's an HLE service. + // The client port can be nullptr for port-less sessions (Like for example File and Directory sessions). + if (client_port != nullptr) + result = client_port->HandleSyncRequest(); + + return result; +} + +} // namespace |
