summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/kernel/client_session.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/core/hle/kernel/client_session.cpp b/src/core/hle/kernel/client_session.cpp
index 6bc49ff64..5ac427bdb 100644
--- a/src/core/hle/kernel/client_session.cpp
+++ b/src/core/hle/kernel/client_session.cpp
@@ -16,9 +16,13 @@ ClientSession::~ClientSession() {
16 // This destructor will be called automatically when the last ClientSession handle is closed by 16 // This destructor will be called automatically when the last ClientSession handle is closed by
17 // the emulated application. 17 // the emulated application.
18 18
19 if (parent->server) { 19 // Local references to ServerSession and SessionRequestHandler are necessary to guarantee they
20 if (parent->server->hle_handler) 20 // will be kept alive until after ClientDisconnected() returns.
21 parent->server->hle_handler->ClientDisconnected(parent->server); 21 SharedPtr<ServerSession> server = parent->server;
22 if (server) {
23 std::shared_ptr<SessionRequestHandler> hle_handler = server->hle_handler;
24 if (hle_handler)
25 hle_handler->ClientDisconnected(server);
22 26
23 // TODO(Subv): Force a wake up of all the ServerSession's waiting threads and set 27 // TODO(Subv): Force a wake up of all the ServerSession's waiting threads and set
24 // their WaitSynchronization result to 0xC920181A. 28 // their WaitSynchronization result to 0xC920181A.
@@ -28,11 +32,13 @@ ClientSession::~ClientSession() {
28} 32}
29 33
30ResultCode ClientSession::SendSyncRequest() { 34ResultCode ClientSession::SendSyncRequest() {
31 // Signal the server session that new data is available 35 // Keep ServerSession alive until we're done working with it.
32 if (parent->server) 36 SharedPtr<ServerSession> server = parent->server;
33 return parent->server->HandleSyncRequest(); 37 if (server == nullptr)
38 return ERR_SESSION_CLOSED_BY_REMOTE;
34 39
35 return ERR_SESSION_CLOSED_BY_REMOTE; 40 // Signal the server session that new data is available
41 return server->HandleSyncRequest();
36} 42}
37 43
38} // namespace 44} // namespace