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/server_session.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'src/core/hle/kernel/server_session.cpp') diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 9447ff236a..a93e55c766 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -14,8 +14,15 @@ ServerSession::ServerSession() = default; ServerSession::~ServerSession() { // This destructor will be called automatically when the last ServerSession handle is closed by // the emulated application. - // TODO(Subv): Reduce the ClientPort's connection count, - // if the session is still open, set the connection status to 3 (Closed by server), + + // Decrease the port's connection count. + if (parent->port) + parent->port->active_sessions--; + + // TODO(Subv): Wake up all the ClientSession's waiting threads and set + // the SendSyncRequest result to 0xC920181A. + + parent->server = nullptr; } ResultVal> ServerSession::Create( @@ -25,6 +32,7 @@ ResultVal> ServerSession::Create( server_session->name = std::move(name); server_session->signaled = false; server_session->hle_handler = std::move(hle_handler); + server_session->parent = nullptr; return MakeResult>(std::move(server_session)); } @@ -61,13 +69,20 @@ ResultCode ServerSession::HandleSyncRequest() { } ServerSession::SessionPair ServerSession::CreateSessionPair( - const std::string& name, std::shared_ptr hle_handler) { + const std::string& name, std::shared_ptr hle_handler, + SharedPtr port) { + auto server_session = ServerSession::Create(name + "_Server", std::move(hle_handler)).MoveFrom(); - // We keep a non-owning pointer to the ServerSession in the ClientSession because we don't want - // to prevent the ServerSession's destructor from being called when the emulated - // application closes the last ServerSession handle. - auto client_session = ClientSession::Create(server_session.get(), name + "_Client").MoveFrom(); + auto client_session = ClientSession::Create(name + "_Client").MoveFrom(); + + std::shared_ptr parent(new Session); + parent->client = client_session.get(); + parent->server = server_session.get(); + parent->port = port; + + client_session->parent = parent; + server_session->parent = parent; return std::make_tuple(std::move(server_session), std::move(client_session)); } -- 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/server_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