hle: kernel: Move ServiceThread ownership to KernelCore.

- Fixes a circular dependency which prevented threads from being released on shutdown.
This commit is contained in:
bunnei
2020-12-15 00:41:48 -08:00
parent f57be2e626
commit dfdac7d38a
4 changed files with 48 additions and 5 deletions

View File

@ -25,7 +25,10 @@
namespace Kernel {
ServerSession::ServerSession(KernelCore& kernel) : SynchronizationObject{kernel} {}
ServerSession::~ServerSession() = default;
ServerSession::~ServerSession() {
kernel.ReleaseServiceThread(service_thread);
}
ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kernel,
std::shared_ptr<Session> parent,
@ -34,7 +37,7 @@ ResultVal<std::shared_ptr<ServerSession>> ServerSession::Create(KernelCore& kern
session->name = std::move(name);
session->parent = std::move(parent);
session->service_thread = std::make_unique<ServiceThread>(kernel, 1, session->name);
session->service_thread = kernel.CreateServiceThread(session->name);
return MakeResult(std::move(session));
}
@ -139,7 +142,11 @@ ResultCode ServerSession::QueueSyncRequest(std::shared_ptr<Thread> thread,
std::make_shared<HLERequestContext>(kernel, memory, SharedFrom(this), std::move(thread));
context->PopulateFromIncomingCommandBuffer(kernel.CurrentProcess()->GetHandleTable(), cmd_buf);
service_thread->QueueSyncRequest(*this, std::move(context));
if (auto strong_ptr = service_thread.lock()) {
strong_ptr->QueueSyncRequest(*this, std::move(context));
return RESULT_SUCCESS;
}
return RESULT_SUCCESS;
}