Merge pull request #3088 from Subv/clientsession_closing
Kernel/Sessions: Wake up any threads waiting on a ServerSession when its client is closed
This commit is contained in:
commit
93742ec510
|
@ -26,9 +26,6 @@ ClientSession::~ClientSession() {
|
|||
if (hle_handler)
|
||||
hle_handler->ClientDisconnected(server);
|
||||
|
||||
// TODO(Subv): Force a wake up of all the ServerSession's waiting threads and set
|
||||
// their WaitSynchronization result to 0xC920181A.
|
||||
|
||||
// Clean up the list of client threads with pending requests, they are unneeded now that the
|
||||
// client endpoint is closed.
|
||||
server->pending_requesting_threads.clear();
|
||||
|
@ -36,6 +33,13 @@ ClientSession::~ClientSession() {
|
|||
}
|
||||
|
||||
parent->client = nullptr;
|
||||
|
||||
if (server) {
|
||||
// Notify any threads waiting on the ServerSession that the endpoint has been closed. Note
|
||||
// that this call has to happen after `Session::client` has been set to nullptr to let the
|
||||
// ServerSession know that the client endpoint has been closed.
|
||||
server->WakeupAllWaitingThreads();
|
||||
}
|
||||
}
|
||||
|
||||
ResultCode ClientSession::SendSyncRequest(SharedPtr<Thread> thread) {
|
||||
|
|
|
@ -47,8 +47,13 @@ bool ServerSession::ShouldWait(Thread* thread) const {
|
|||
|
||||
void ServerSession::Acquire(Thread* thread) {
|
||||
ASSERT_MSG(!ShouldWait(thread), "object unavailable!");
|
||||
|
||||
// If the client endpoint was closed, don't do anything. This ServerSession is now useless and
|
||||
// will linger until its last handle is closed by the running application.
|
||||
if (parent->client == nullptr)
|
||||
return;
|
||||
|
||||
// We are now handling a request, pop it from the stack.
|
||||
// TODO(Subv): What happens if the client endpoint is closed before any requests are made?
|
||||
ASSERT(!pending_requesting_threads.empty());
|
||||
currently_handling = pending_requesting_threads.back();
|
||||
pending_requesting_threads.pop_back();
|
||||
|
|
Reference in New Issue