From f6b9b7910eb59cdc1e3aea9a1f1cb3d1cf8ae7f6 Mon Sep 17 00:00:00 2001 From: bunnei Date: Mon, 25 Nov 2019 18:17:08 -0500 Subject: kernel: Fix reference management for client/server session. - Fixes shutdown crash and crash in Pokemon SwSh. --- src/core/hle/kernel/server_session.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 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 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> 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; -- cgit v1.2.3