From 073653e858abf377fd1ebbdb071809c8830ce99d Mon Sep 17 00:00:00 2001 From: Subv Date: Tue, 14 Jun 2016 18:03:30 -0500 Subject: 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. --- src/core/hle/kernel/client_session.cpp | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/core/hle/kernel/client_session.cpp (limited to 'src/core/hle/kernel/client_session.cpp') 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> ClientSession::Create(SharedPtr server_session, SharedPtr client_port, std::string name) { + SharedPtr client_session(new ClientSession); + + client_session->name = std::move(name); + client_session->server_session = server_session; + client_session->client_port = client_port; + + return MakeResult>(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 -- cgit v1.2.3 From c5e7e0fa26fc793c8b9f3effe25586f7fb57953e Mon Sep 17 00:00:00 2001 From: Subv Date: Sat, 18 Jun 2016 13:39:26 -0500 Subject: IPC/HLE: Associate the ClientSessions with their parent port's HLE interface if it exists. Pass the triggering ServerSession to the HLE command handler to differentiate which session caused the request. --- src/core/hle/kernel/client_session.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index f1ad9b65b..22fa2ff03 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -8,6 +8,7 @@ #include "core/hle/kernel/client_session.h" #include "core/hle/kernel/server_session.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/service/service.h" namespace Kernel { @@ -20,6 +21,7 @@ ResultVal> ClientSession::Create(SharedPtrname = std::move(name); client_session->server_session = server_session; client_session->client_port = client_port; + client_session->hle_helper = client_port->hle_interface; return MakeResult>(std::move(client_session)); } @@ -31,10 +33,9 @@ ResultCode ClientSession::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(); + // If this ClientSession has an associated HLE helper, forward the request to it. + if (hle_helper != nullptr) + result = hle_helper->HandleSyncRequest(server_session); return result; } -- cgit v1.2.3 From 009b15b3aa9858930f461d825f7dd030fc963801 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 30 Nov 2016 22:50:13 -0500 Subject: A bit of a redesign. Sessions and Ports are now detached from each other. HLE services are handled by means of a SessionRequestHandler class, Interface now inherits from this class. The File and Directory classes are no longer kernel objects, but SessionRequestHandlers instead, bound to a ServerSession when requested. File::OpenLinkFile now creates a new session pair and binds the File instance to it. --- src/core/hle/kernel/client_session.cpp | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 22fa2ff03..31ea8045a 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -15,29 +15,17 @@ namespace Kernel { ClientSession::ClientSession() {} ClientSession::~ClientSession() {} -ResultVal> ClientSession::Create(SharedPtr server_session, SharedPtr client_port, std::string name) { +ResultVal> ClientSession::Create(SharedPtr server_session, std::string name) { SharedPtr client_session(new ClientSession); client_session->name = std::move(name); client_session->server_session = server_session; - client_session->client_port = client_port; - client_session->hle_helper = client_port->hle_interface; - return MakeResult>(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; - - // If this ClientSession has an associated HLE helper, forward the request to it. - if (hle_helper != nullptr) - result = hle_helper->HandleSyncRequest(server_session); - - return result; + return server_session->HandleSyncRequest(); } } // namespace -- cgit v1.2.3 From 2eceee3a4cc2786dae4e9b80a8b5f3bb666d3fc6 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 30 Nov 2016 23:28:31 -0500 Subject: Fixed the rebase mistakes. --- src/core/hle/kernel/client_session.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 31ea8045a..c8be29b0a 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -4,11 +4,8 @@ #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" -#include "core/hle/service/service.h" namespace Kernel { -- cgit v1.2.3 From 2ce61344d612b8574e12d8acdf59ac994b390ab5 Mon Sep 17 00:00:00 2001 From: Subv Date: Fri, 2 Dec 2016 22:58:02 -0500 Subject: Declare empty ServerSession and ClientSession constructors as default. --- src/core/hle/kernel/client_session.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index c8be29b0a..c90fbc69d 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -9,8 +9,8 @@ namespace Kernel { -ClientSession::ClientSession() {} -ClientSession::~ClientSession() {} +ClientSession::ClientSession() = default; +ClientSession::~ClientSession() = default; ResultVal> ClientSession::Create(SharedPtr server_session, std::string name) { SharedPtr client_session(new ClientSession); -- cgit v1.2.3 From dd8887c8cfbb6d3010dde240278a3d4018c5dd85 Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 5 Dec 2016 11:02:08 -0500 Subject: KServerPorts now have an HLE handler "template", which is inherited by all ServerSessions created from it. --- src/core/hle/kernel/client_session.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index c90fbc69d..6c577610d 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -20,7 +20,7 @@ ResultVal> ClientSession::Create(SharedPtr>(std::move(client_session)); } -ResultCode ClientSession::HandleSyncRequest() { +ResultCode ClientSession::SendSyncRequest() { // Signal the server session that new data is available return server_session->HandleSyncRequest(); } -- cgit v1.2.3 From f9bcf895103e5a6d99f5fe755bcac92b7781fd38 Mon Sep 17 00:00:00 2001 From: Subv Date: Thu, 8 Dec 2016 11:06:19 -0500 Subject: Use std::move where appropriate. --- src/core/hle/kernel/client_session.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 6c577610d..30ef10764 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -16,7 +16,7 @@ ResultVal> ClientSession::Create(SharedPtr client_session(new ClientSession); client_session->name = std::move(name); - client_session->server_session = server_session; + client_session->server_session = std::move(server_session); return MakeResult>(std::move(client_session)); } -- cgit v1.2.3 From 386112da3265d111595329508b860800e5cf14e8 Mon Sep 17 00:00:00 2001 From: Subv Date: Thu, 8 Dec 2016 15:01:10 -0500 Subject: Added a framework for partially handling Session disconnections. Further implementation will happen in a future commit. Fixes a regression. --- src/core/hle/kernel/client_session.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 30ef10764..17302baca 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -10,13 +10,22 @@ namespace Kernel { ClientSession::ClientSession() = default; -ClientSession::~ClientSession() = default; +ClientSession::~ClientSession() { + // This destructor will be called automatically when the last ClientSession handle is closed by the emulated application. -ResultVal> ClientSession::Create(SharedPtr server_session, std::string name) { + if (server_session->hle_handler) + server_session->hle_handler->ClientDisconnected(server_session); + + // TODO(Subv): If the session is still open, set the connection status to 2 (Closed by client), + // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to 0xC920181A. +} + +ResultVal> ClientSession::Create(ServerSession* server_session, std::string name) { SharedPtr client_session(new ClientSession); client_session->name = std::move(name); - client_session->server_session = std::move(server_session); + client_session->server_session = server_session; + client_session->session_status = SessionStatus::Open; return MakeResult>(std::move(client_session)); } -- cgit v1.2.3 From 016307ae656afc85ab59a5c2598205ef81f99231 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 14 Dec 2016 12:33:49 -0500 Subject: Fixed the codestyle to match our clang-format rules. --- src/core/hle/kernel/client_session.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/core/hle/kernel/client_session.cpp') diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index 17302baca..0331386ec 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -11,16 +11,19 @@ namespace Kernel { ClientSession::ClientSession() = default; ClientSession::~ClientSession() { - // This destructor will be called automatically when the last ClientSession handle is closed by the emulated application. + // This destructor will be called automatically when the last ClientSession handle is closed by + // the emulated application. if (server_session->hle_handler) server_session->hle_handler->ClientDisconnected(server_session); // TODO(Subv): If the session is still open, set the connection status to 2 (Closed by client), - // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to 0xC920181A. + // wake up all the ServerSession's waiting threads and set the WaitSynchronization result to + // 0xC920181A. } -ResultVal> ClientSession::Create(ServerSession* server_session, std::string name) { +ResultVal> ClientSession::Create(ServerSession* server_session, + std::string name) { SharedPtr client_session(new ClientSession); client_session->name = std::move(name); -- cgit v1.2.3