diff options
| -rw-r--r-- | src/core/hle/kernel/client_session.cpp | 20 |
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 | ||
| 30 | ResultCode ClientSession::SendSyncRequest() { | 34 | ResultCode 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 |