diff options
author | bunnei <bunneidev@gmail.com> | 2022-01-15 01:36:10 +0100 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2022-01-15 01:44:14 +0100 |
commit | f499c8177e661b2fadacb28aebb106e4b16c7ab1 (patch) | |
tree | ef0fb41e55a1f453f0e19ec8a122630a5d77cb4f /src/core/hle/kernel/k_thread.cpp | |
parent | core: hle: kernel: KProcess: Integrate with KWorkerTask and add unimplemented DoWorkerTaskImpl. (diff) | |
download | yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.tar yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.tar.gz yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.tar.bz2 yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.tar.lz yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.tar.xz yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.tar.zst yuzu-f499c8177e661b2fadacb28aebb106e4b16c7ab1.zip |
Diffstat (limited to 'src/core/hle/kernel/k_thread.cpp')
-rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 3cb995ddb..7a5e6fc08 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -30,6 +30,7 @@ #include "core/hle/kernel/k_system_control.h" #include "core/hle/kernel/k_thread.h" #include "core/hle/kernel/k_thread_queue.h" +#include "core/hle/kernel/k_worker_task_manager.h" #include "core/hle/kernel/kernel.h" #include "core/hle/kernel/svc_results.h" #include "core/hle/kernel/time_manager.h" @@ -332,7 +333,7 @@ void KThread::Finalize() { } // Perform inherited finalization. - KAutoObjectWithSlabHeapAndContainer<KThread, KSynchronizationObject>::Finalize(); + KSynchronizationObject::Finalize(); } bool KThread::IsSignaled() const { @@ -376,11 +377,28 @@ void KThread::StartTermination() { // Register terminated dpc flag. RegisterDpc(DpcFlag::Terminated); +} + +void KThread::FinishTermination() { + // Ensure that the thread is not executing on any core. + if (parent != nullptr) { + for (std::size_t i = 0; i < static_cast<std::size_t>(Core::Hardware::NUM_CPU_CORES); ++i) { + KThread* core_thread{}; + do { + core_thread = kernel.Scheduler(i).GetCurrentThread(); + } while (core_thread == this); + } + } // Close the thread. this->Close(); } +void KThread::DoWorkerTaskImpl() { + // Finish the termination that was begun by Exit(). + this->FinishTermination(); +} + void KThread::Pin(s32 current_core) { ASSERT(kernel.GlobalSchedulerContext().IsLocked()); @@ -1027,6 +1045,9 @@ void KThread::Exit() { // Start termination. StartTermination(); + + // Register the thread as a work task. + KWorkerTaskManager::AddTask(kernel, KWorkerTaskManager::WorkerType::Exit, this); } } |