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
-
78src/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