diff options
| author | 2022-01-14 16:24:59 -0800 | |
|---|---|---|
| committer | 2022-01-14 16:43:59 -0800 | |
| commit | bf32fcc817a0f3fcbe90e8e5b5ba325ef0480d3f (patch) | |
| tree | cab10043311fb326552461417e7fe7f47e71ff47 /src | |
| parent | common: fiber: YieldTo: Avoid hard crash on nullptr previous_fiber. (diff) | |
| download | yuzu-bf32fcc817a0f3fcbe90e8e5b5ba325ef0480d3f.tar.gz yuzu-bf32fcc817a0f3fcbe90e8e5b5ba325ef0480d3f.tar.xz yuzu-bf32fcc817a0f3fcbe90e8e5b5ba325ef0480d3f.zip | |
core: hle: kernel: Add KWorkerTask and KWorkerTaskManager.
- These primitives are used to dispatch asynchronous kernel tasks from KThread and KProcess.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_worker_task.h | 18 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_worker_task_manager.cpp | 42 | ||||
| -rw-r--r-- | src/core/hle/kernel/k_worker_task_manager.h | 33 |
4 files changed, 96 insertions, 0 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index b1a746727..6e8d11919 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt | |||
| @@ -247,6 +247,9 @@ add_library(core STATIC | |||
| 247 | hle/kernel/k_trace.h | 247 | hle/kernel/k_trace.h |
| 248 | hle/kernel/k_transfer_memory.cpp | 248 | hle/kernel/k_transfer_memory.cpp |
| 249 | hle/kernel/k_transfer_memory.h | 249 | hle/kernel/k_transfer_memory.h |
| 250 | hle/kernel/k_worker_task.h | ||
| 251 | hle/kernel/k_worker_task_manager.cpp | ||
| 252 | hle/kernel/k_worker_task_manager.h | ||
| 250 | hle/kernel/k_writable_event.cpp | 253 | hle/kernel/k_writable_event.cpp |
| 251 | hle/kernel/k_writable_event.h | 254 | hle/kernel/k_writable_event.h |
| 252 | hle/kernel/kernel.cpp | 255 | hle/kernel/kernel.cpp |
diff --git a/src/core/hle/kernel/k_worker_task.h b/src/core/hle/kernel/k_worker_task.h new file mode 100644 index 000000000..b7794c6a8 --- /dev/null +++ b/src/core/hle/kernel/k_worker_task.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | // Copyright 2022 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "core/hle/kernel/k_synchronization_object.h" | ||
| 8 | |||
| 9 | namespace Kernel { | ||
| 10 | |||
| 11 | class KWorkerTask : public KSynchronizationObject { | ||
| 12 | public: | ||
| 13 | explicit KWorkerTask(KernelCore& kernel_); | ||
| 14 | |||
| 15 | void DoWorkerTask(); | ||
| 16 | }; | ||
| 17 | |||
| 18 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/k_worker_task_manager.cpp b/src/core/hle/kernel/k_worker_task_manager.cpp new file mode 100644 index 000000000..785e08111 --- /dev/null +++ b/src/core/hle/kernel/k_worker_task_manager.cpp | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | // Copyright 2022 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #include "common/assert.h" | ||
| 6 | #include "core/hle/kernel/k_process.h" | ||
| 7 | #include "core/hle/kernel/k_thread.h" | ||
| 8 | #include "core/hle/kernel/k_worker_task.h" | ||
| 9 | #include "core/hle/kernel/k_worker_task_manager.h" | ||
| 10 | #include "core/hle/kernel/kernel.h" | ||
| 11 | |||
| 12 | namespace Kernel { | ||
| 13 | |||
| 14 | KWorkerTask::KWorkerTask(KernelCore& kernel_) : KSynchronizationObject{kernel_} {} | ||
| 15 | |||
| 16 | void KWorkerTask::DoWorkerTask() { | ||
| 17 | if (auto* const thread = this->DynamicCast<KThread*>(); thread != nullptr) { | ||
| 18 | return thread->DoWorkerTaskImpl(); | ||
| 19 | } else { | ||
| 20 | auto* const process = this->DynamicCast<KProcess*>(); | ||
| 21 | ASSERT(process != nullptr); | ||
| 22 | |||
| 23 | return process->DoWorkerTaskImpl(); | ||
| 24 | } | ||
| 25 | } | ||
| 26 | |||
| 27 | KWorkerTaskManager::KWorkerTaskManager() : m_waiting_thread(1, "yuzu:KWorkerTaskManager") {} | ||
| 28 | |||
| 29 | void KWorkerTaskManager::AddTask(KernelCore& kernel, WorkerType type, KWorkerTask* task) { | ||
| 30 | ASSERT(type <= WorkerType::Count); | ||
| 31 | kernel.WorkerTaskManager().AddTask(kernel, task); | ||
| 32 | } | ||
| 33 | |||
| 34 | void KWorkerTaskManager::AddTask(KernelCore& kernel, KWorkerTask* task) { | ||
| 35 | KScopedSchedulerLock sl(kernel); | ||
| 36 | m_waiting_thread.QueueWork([task]() { | ||
| 37 | // Do the task. | ||
| 38 | task->DoWorkerTask(); | ||
| 39 | }); | ||
| 40 | } | ||
| 41 | |||
| 42 | } // namespace Kernel | ||
diff --git a/src/core/hle/kernel/k_worker_task_manager.h b/src/core/hle/kernel/k_worker_task_manager.h new file mode 100644 index 000000000..43d1bfcec --- /dev/null +++ b/src/core/hle/kernel/k_worker_task_manager.h | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | // Copyright 2022 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include "common/common_types.h" | ||
| 8 | #include "common/thread_worker.h" | ||
| 9 | |||
| 10 | namespace Kernel { | ||
| 11 | |||
| 12 | class KernelCore; | ||
| 13 | class KWorkerTask; | ||
| 14 | |||
| 15 | class KWorkerTaskManager final { | ||
| 16 | public: | ||
| 17 | enum class WorkerType : u32 { | ||
| 18 | Exit, | ||
| 19 | Count, | ||
| 20 | }; | ||
| 21 | |||
| 22 | KWorkerTaskManager(); | ||
| 23 | |||
| 24 | static void AddTask(KernelCore& kernel_, WorkerType type, KWorkerTask* task); | ||
| 25 | |||
| 26 | private: | ||
| 27 | void AddTask(KernelCore& kernel, KWorkerTask* task); | ||
| 28 | |||
| 29 | private: | ||
| 30 | Common::ThreadWorker m_waiting_thread; | ||
| 31 | }; | ||
| 32 | |||
| 33 | } // namespace Kernel | ||