Browse Source
Merge pull request #7712 from bunnei/fix-thread-exit
Merge pull request #7712 from bunnei/fix-thread-exit
Accurately implement thread exitnce_cpp
committed by
GitHub
11 changed files with 181 additions and 39 deletions
-
5src/common/fiber.cpp
-
3src/core/CMakeLists.txt
-
6src/core/hle/kernel/k_process.cpp
-
6src/core/hle/kernel/k_process.h
-
70src/core/hle/kernel/k_thread.cpp
-
11src/core/hle/kernel/k_thread.h
-
18src/core/hle/kernel/k_worker_task.h
-
42src/core/hle/kernel/k_worker_task_manager.cpp
-
33src/core/hle/kernel/k_worker_task_manager.h
-
11src/core/hle/kernel/kernel.cpp
-
7src/core/hle/kernel/kernel.h
@ -0,0 +1,18 @@ |
|||
// Copyright 2022 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/kernel/k_synchronization_object.h" |
|||
|
|||
namespace Kernel { |
|||
|
|||
class KWorkerTask : public KSynchronizationObject { |
|||
public: |
|||
explicit KWorkerTask(KernelCore& kernel_); |
|||
|
|||
void DoWorkerTask(); |
|||
}; |
|||
|
|||
} // namespace Kernel |
|||
@ -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
|
|||
@ -0,0 +1,33 @@ |
|||
// Copyright 2022 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "common/common_types.h" |
|||
#include "common/thread_worker.h" |
|||
|
|||
namespace Kernel { |
|||
|
|||
class KernelCore; |
|||
class KWorkerTask; |
|||
|
|||
class KWorkerTaskManager final { |
|||
public: |
|||
enum class WorkerType : u32 { |
|||
Exit, |
|||
Count, |
|||
}; |
|||
|
|||
KWorkerTaskManager(); |
|||
|
|||
static void AddTask(KernelCore& kernel_, WorkerType type, KWorkerTask* task); |
|||
|
|||
private: |
|||
void AddTask(KernelCore& kernel, KWorkerTask* task); |
|||
|
|||
private: |
|||
Common::ThreadWorker m_waiting_thread; |
|||
}; |
|||
|
|||
} // namespace Kernel |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue