From b9ae721dfeae383236fed3131d6d42b3ef564821 Mon Sep 17 00:00:00 2001 From: Maufeat Date: Sat, 29 Aug 2026 17:21:13 +0200 Subject: [PATCH] return ResultSessionClosed when a session is closed --- src/core/hle/kernel/k_server_session.cpp | 4 ++-- src/core/hle/kernel/k_server_session.h | 6 +++--- src/core/hle/service/server_manager.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/hle/kernel/k_server_session.cpp b/src/core/hle/kernel/k_server_session.cpp index e3cfe6b6c2..35b4e78534 100644 --- a/src/core/hle/kernel/k_server_session.cpp +++ b/src/core/hle/kernel/k_server_session.cpp @@ -1216,7 +1216,7 @@ Result KServerSession::ReceiveRequest(KernelCore& kernel, uintptr_t server_messa } Result KServerSession::SendReply(KernelCore& kernel, uintptr_t server_message, uintptr_t server_buffer_size, - KPhysicalAddress server_message_paddr, bool is_hle) { + KPhysicalAddress server_message_paddr, bool is_hle, bool session_closed) { // Lock the session. KScopedLightLock lk{m_lock}; @@ -1248,7 +1248,7 @@ Result KServerSession::SendReply(KernelCore& kernel, uintptr_t server_message, u KEvent* event = request->GetEvent(); // Check whether we're closed. - const bool closed = (client_thread == nullptr || m_parent->IsClientClosed()); + const bool closed = (client_thread == nullptr || m_parent->IsClientClosed() || session_closed); Result result = ResultSuccess; if (!closed) { diff --git a/src/core/hle/kernel/k_server_session.h b/src/core/hle/kernel/k_server_session.h index 217e7dc7be..90aaa6dd77 100644 --- a/src/core/hle/kernel/k_server_session.h +++ b/src/core/hle/kernel/k_server_session.h @@ -54,14 +54,14 @@ public: Result OnRequest(KernelCore& kernel, KSessionRequest* request); Result SendReply(KernelCore& kernel, uintptr_t server_message, uintptr_t server_buffer_size, - KPhysicalAddress server_message_paddr, bool is_hle = false); + KPhysicalAddress server_message_paddr, bool is_hle = false, bool session_closed = false); Result ReceiveRequest(KernelCore& kernel, uintptr_t server_message, uintptr_t server_buffer_size, KPhysicalAddress server_message_paddr, std::shared_ptr* out_context = nullptr, std::weak_ptr manager = {}); - Result SendReplyHLE(KernelCore& kernel) { - R_RETURN(this->SendReply(kernel, 0, 0, 0, true)); + Result SendReplyHLE(KernelCore& kernel, bool session_closed = false) { + R_RETURN(this->SendReply(kernel, 0, 0, 0, true, session_closed)); } Result ReceiveRequestHLE(KernelCore& kernel, std::shared_ptr* out_context, diff --git a/src/core/hle/service/server_manager.cpp b/src/core/hle/service/server_manager.cpp index ee0dc83ee8..4b3db04c76 100644 --- a/src/core/hle/service/server_manager.cpp +++ b/src/core/hle/service/server_manager.cpp @@ -393,7 +393,7 @@ Result ServerManager::CompleteSyncRequest(Session* session) { } // Send the reply. - res = server_session->SendReplyHLE(m_system.Kernel()); + res = server_session->SendReplyHLE(m_system.Kernel(), service_res == IPC::ResultSessionClosed); // If the session has been closed, we're done. if (res == Kernel::ResultSessionClosed || service_res == IPC::ResultSessionClosed) {