From 9c496013b3fcde16f9152fa53dfe5ecd6f7655ce Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 4 Jan 2017 23:23:17 -0500 Subject: Kernel: Use a Session object to keep track of the status of a Client/Server session pair. Reduce the associated port's connection count when a ServerSession is destroyed. --- src/core/hle/kernel/client_session.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 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 0331386ec2..c2f48176e0 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -14,27 +14,33 @@ ClientSession::~ClientSession() { // 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); + if (parent->server) { + if (parent->server->hle_handler) + parent->server->hle_handler->ClientDisconnected(parent->server); - // 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. + // TODO(Subv): Force a wake up of all the ServerSession's waiting threads and set + // their WaitSynchronization result to 0xC920181A. + } + + parent->client = nullptr; } -ResultVal> ClientSession::Create(ServerSession* server_session, - std::string name) { +ResultVal> ClientSession::Create(std::string name) { SharedPtr client_session(new ClientSession); client_session->name = std::move(name); - client_session->server_session = server_session; + client_session->parent = nullptr; client_session->session_status = SessionStatus::Open; return MakeResult>(std::move(client_session)); } ResultCode ClientSession::SendSyncRequest() { // Signal the server session that new data is available - return server_session->HandleSyncRequest(); + if (parent->server) + return parent->server->HandleSyncRequest(); + + return ResultCode(ErrorDescription::SessionClosedByRemote, ErrorModule::OS, + ErrorSummary::Canceled, ErrorLevel::Status); } } // namespace -- cgit v1.2.3 From f98eb7d31515d3dbdd6b2f69a5d8004128340622 Mon Sep 17 00:00:00 2001 From: Subv Date: Wed, 4 Jan 2017 23:24:06 -0500 Subject: Kernel: Remove a now unused enum and variable regarding a session's status. --- src/core/hle/kernel/client_session.cpp | 1 - src/core/hle/kernel/client_session.h | 7 ------- 2 files changed, 8 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 c2f48176e0..6737b204b2 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -30,7 +30,6 @@ ResultVal> ClientSession::Create(std::string name) { client_session->name = std::move(name); client_session->parent = nullptr; - client_session->session_status = SessionStatus::Open; return MakeResult>(std::move(client_session)); } diff --git a/src/core/hle/kernel/client_session.h b/src/core/hle/kernel/client_session.h index adb2d0b5ff..5ec4ee9014 100644 --- a/src/core/hle/kernel/client_session.h +++ b/src/core/hle/kernel/client_session.h @@ -16,12 +16,6 @@ namespace Kernel { class ServerSession; class Session; -enum class SessionStatus { - Open = 1, - ClosedByClient = 2, - ClosedBYServer = 3, -}; - class ClientSession final : public Object { public: friend class ServerSession; @@ -49,7 +43,6 @@ public: /// The parent session, which links to the server endpoint. std::shared_ptr parent; - SessionStatus session_status; ///< The session's current status. private: ClientSession(); -- cgit v1.2.3 From 8e4b05c22abcbd49808a775bcd7508cfd717677b Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 21 May 2017 18:52:42 -0500 Subject: Kernel/Sessions: Remove the ClientSession::Create function. It is not meant to be used by anything other than CreateSessionPair. --- src/core/hle/kernel/client_session.cpp | 8 -------- src/core/hle/kernel/client_session.h | 7 ------- src/core/hle/kernel/server_session.cpp | 4 +++- 3 files changed, 3 insertions(+), 16 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 6737b204b2..e297b7464d 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -25,14 +25,6 @@ ClientSession::~ClientSession() { parent->client = nullptr; } -ResultVal> ClientSession::Create(std::string name) { - SharedPtr client_session(new ClientSession); - - client_session->name = std::move(name); - client_session->parent = nullptr; - return MakeResult>(std::move(client_session)); -} - ResultCode ClientSession::SendSyncRequest() { // Signal the server session that new data is available if (parent->server) diff --git a/src/core/hle/kernel/client_session.h b/src/core/hle/kernel/client_session.h index 5ec4ee9014..9f3adb72b8 100644 --- a/src/core/hle/kernel/client_session.h +++ b/src/core/hle/kernel/client_session.h @@ -47,13 +47,6 @@ public: private: ClientSession(); ~ClientSession() override; - - /** - * Creates a client session. - * @param name Optional name of client session - * @return The created client session - */ - static ResultVal> Create(std::string name = "Unknown"); }; } // namespace diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index a93e55c766..500b909ab2 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -74,7 +74,9 @@ ServerSession::SessionPair ServerSession::CreateSessionPair( auto server_session = ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); - auto client_session = ClientSession::Create(name + "_Client").MoveFrom(); + + SharedPtr client_session(new ClientSession); + client_session->name = name + "_Client"; std::shared_ptr parent(new Session); parent->client = client_session.get(); -- cgit v1.2.3