|
|
|
@ -0,0 +1,42 @@ |
|
|
|
// Copyright 2022 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
#include "core/hle/kernel/k_process.h"
|
|
|
|
#include "core/hle/kernel/k_thread.h"
|
|
|
|
#include "core/hle/kernel/k_worker_task.h"
|
|
|
|
#include "core/hle/kernel/k_worker_task_manager.h"
|
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
|
|
|
|
|
namespace Kernel { |
|
|
|
|
|
|
|
KWorkerTask::KWorkerTask(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} |
|
|
|
|
|
|
|
void KWorkerTask::DoWorkerTask() { |
|
|
|
if (auto* const thread = this->DynamicCast<KThread*>(); thread != nullptr) { |
|
|
|
return thread->DoWorkerTaskImpl(); |
|
|
|
} else { |
|
|
|
auto* const process = this->DynamicCast<KProcess*>(); |
|
|
|
ASSERT(process != nullptr); |
|
|
|
|
|
|
|
return process->DoWorkerTaskImpl(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
KWorkerTaskManager::KWorkerTaskManager() : m_waiting_thread(1, "yuzu:KWorkerTaskManager") {} |
|
|
|
|
|
|
|
void KWorkerTaskManager::AddTask(KernelCore& kernel, WorkerType type, KWorkerTask* task) { |
|
|
|
ASSERT(type <= WorkerType::Count); |
|
|
|
kernel.WorkerTaskManager().AddTask(kernel, task); |
|
|
|
} |
|
|
|
|
|
|
|
void KWorkerTaskManager::AddTask(KernelCore& kernel, KWorkerTask* task) { |
|
|
|
KScopedSchedulerLock sl(kernel); |
|
|
|
m_waiting_thread.QueueWork([task]() { |
|
|
|
// Do the task.
|
|
|
|
task->DoWorkerTask(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Kernel
|