diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-11-26 12:13:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-26 12:13:04 +0100 |
commit | 59484442a0a7bf72f6b627a9b0672898314f2dad (patch) | |
tree | 2514317ed0d0ada5de3a219bdd1f5baa635760dc | |
parent | Merge pull request #3160 from DarkLordZach/opt-ea-clang-fmt (diff) | |
parent | kernel: Fix reference management for client/server session. (diff) | |
download | yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.tar yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.tar.gz yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.tar.bz2 yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.tar.lz yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.tar.xz yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.tar.zst yuzu-59484442a0a7bf72f6b627a9b0672898314f2dad.zip |
-rw-r--r-- | src/core/hle/kernel/client_session.cpp | 16 | ||||
-rw-r--r-- | src/core/hle/kernel/server_session.cpp | 18 | ||||
-rw-r--r-- | src/core/hle/kernel/session.h | 4 |
3 files changed, 18 insertions, 20 deletions
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index bc59d3306..5995a6556 100644 --- a/src/core/hle/kernel/client_session.cpp +++ b/src/core/hle/kernel/client_session.cpp @@ -16,20 +16,18 @@ ClientSession::ClientSession(KernelCore& kernel) : Object{kernel} {} ClientSession::~ClientSession() { // This destructor will be called automatically when the last ClientSession handle is closed by // the emulated application. - if (parent->server) { - parent->server->ClientDisconnected(); + if (auto server = parent->server.lock()) { + server->ClientDisconnected(); } - - parent->client = nullptr; } ResultCode ClientSession::SendSyncRequest(Thread* thread) { - // Keep ServerSession alive until we're done working with it. - if (parent->server == nullptr) - return ERR_SESSION_CLOSED_BY_REMOTE; - // Signal the server session that new data is available - return parent->server->HandleSyncRequest(SharedFrom(thread)); + if (auto server = parent->server.lock()) { + return server->HandleSyncRequest(SharedFrom(thread)); + } + + return ERR_SESSION_CLOSED_BY_REMOTE; } } // namespace Kernel diff --git a/src/core/hle/kernel/server_session.cpp b/src/core/hle/kernel/server_session.cpp index 2994fa0ac..c7db21eb2 100644 --- a/src/core/hle/kernel/server_session.cpp +++ b/src/core/hle/kernel/server_session.cpp @@ -31,8 +31,6 @@ ServerSession::~ServerSession() { if (parent->port) { parent->port->ConnectionClosed(); } - - parent->server = nullptr; } ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kernel, @@ -46,11 +44,13 @@ ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kern } bool ServerSession::ShouldWait(const Thread* thread) const { - // Closed sessions should never wait, an error will be returned from svcReplyAndReceive. - if (parent->client == nullptr) - return false; // Wait if we have no pending requests, or if we're currently handling a request. - return pending_requesting_threads.empty() || currently_handling != nullptr; + if (auto client = parent->client.lock()) { + return pending_requesting_threads.empty() || currently_handling != nullptr; + } + + // Closed sessions should never wait, an error will be returned from svcReplyAndReceive. + return {}; } void ServerSession::Acquire(Thread* thread) { @@ -192,9 +192,9 @@ ServerSession::SessionPair ServerSession::CreateSessionPair(KernelCore& kernel, std::shared_ptr<ClientSession> client_session = std::make_shared<ClientSession>(kernel); client_session->name = name + "_Client"; - std::shared_ptr<Session> parent(new Session); - parent->client = client_session.get(); - parent->server = server_session.get(); + std::shared_ptr<Session> parent = std::make_shared<Session>(); + parent->client = client_session; + parent->server = server_session; parent->port = std::move(port); client_session->parent = parent; diff --git a/src/core/hle/kernel/session.h b/src/core/hle/kernel/session.h index ea956813b..94395f9f5 100644 --- a/src/core/hle/kernel/session.h +++ b/src/core/hle/kernel/session.h @@ -20,8 +20,8 @@ class ServerSession; */ class Session final { public: - ClientSession* client = nullptr; ///< The client endpoint of the session. - ServerSession* server = nullptr; ///< The server endpoint of the session. + std::weak_ptr<ClientSession> client; ///< The client endpoint of the session. + std::weak_ptr<ServerSession> server; ///< The server endpoint of the session. std::shared_ptr<ClientPort> port; ///< The port that this session is associated with (optional). }; } // namespace Kernel |