diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp index bc59d33061..5995a65569 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 2994fa0acb..c7db21eb21 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> ServerSession::Create(KernelCore& kernel, @@ -46,11 +44,13 @@ ResultVal> 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 client_session = std::make_shared(kernel); client_session->name = name + "_Client"; - std::shared_ptr parent(new Session); - parent->client = client_session.get(); - parent->server = server_session.get(); + std::shared_ptr parent = std::make_shared(); + 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 ea956813b7..94395f9f55 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 client; ///< The client endpoint of the session. + std::weak_ptr server; ///< The server endpoint of the session. std::shared_ptr port; ///< The port that this session is associated with (optional). }; } // namespace Kernel