diff options
author | bunnei <bunneidev@gmail.com> | 2021-08-19 00:42:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-19 00:42:46 +0200 |
commit | aa40084c241129ef08081bae72bd5de1b4c86348 (patch) | |
tree | b4f406cbf0f230cf9064040992ce3ef8bf54e5a7 /src/core/hle/kernel/k_thread.cpp | |
parent | Merge pull request #6863 from spholz/fix-lan-play (diff) | |
parent | core: hle: kernel: Disable dispatch count tracking on single core. (diff) | |
download | yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.tar yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.tar.gz yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.tar.bz2 yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.tar.lz yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.tar.xz yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.tar.zst yuzu-aa40084c241129ef08081bae72bd5de1b4c86348.zip |
Diffstat (limited to 'src/core/hle/kernel/k_thread.cpp')
-rw-r--r-- | src/core/hle/kernel/k_thread.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/core/hle/kernel/k_thread.cpp b/src/core/hle/kernel/k_thread.cpp index 9f1d3156b..0f6808ade 100644 --- a/src/core/hle/kernel/k_thread.cpp +++ b/src/core/hle/kernel/k_thread.cpp @@ -14,6 +14,7 @@ #include "common/fiber.h" #include "common/logging/log.h" #include "common/scope_exit.h" +#include "common/settings.h" #include "common/thread_queue_list.h" #include "core/core.h" #include "core/cpu_manager.h" @@ -188,7 +189,7 @@ ResultCode KThread::Initialize(KThreadFunction func, uintptr_t arg, VAddr user_s // Setup the stack parameters. StackParameters& sp = GetStackParameters(); sp.cur_thread = this; - sp.disable_count = 1; + sp.disable_count = 0; SetInExceptionHandler(); // Set thread ID. @@ -215,9 +216,10 @@ ResultCode KThread::InitializeThread(KThread* thread, KThreadFunction func, uint // Initialize the thread. R_TRY(thread->Initialize(func, arg, user_stack_top, prio, core, owner, type)); - // Initialize host context. + // Initialize emulation parameters. thread->host_context = std::make_shared<Common::Fiber>(std::move(init_func), init_func_parameter); + thread->is_single_core = !Settings::values.use_multi_core.GetValue(); return ResultSuccess; } @@ -970,6 +972,9 @@ ResultCode KThread::Run() { // Set our state and finish. SetState(ThreadState::Runnable); + + DisableDispatch(); + return ResultSuccess; } } @@ -1054,4 +1059,16 @@ s32 GetCurrentCoreId(KernelCore& kernel) { return GetCurrentThread(kernel).GetCurrentCore(); } +KScopedDisableDispatch::~KScopedDisableDispatch() { + if (GetCurrentThread(kernel).GetDisableDispatchCount() <= 1) { + auto scheduler = kernel.CurrentScheduler(); + + if (scheduler) { + scheduler->RescheduleCurrentCore(); + } + } else { + GetCurrentThread(kernel).EnableDispatch(); + } +} + } // namespace Kernel |