summaryrefslogtreecommitdiffstats
path: root/src/core/hle/kernel/k_thread.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-08-19 00:42:46 +0200
committerGitHub <noreply@github.com>2021-08-19 00:42:46 +0200
commitaa40084c241129ef08081bae72bd5de1b4c86348 (patch)
treeb4f406cbf0f230cf9064040992ce3ef8bf54e5a7 /src/core/hle/kernel/k_thread.cpp
parentMerge pull request #6863 from spholz/fix-lan-play (diff)
parentcore: hle: kernel: Disable dispatch count tracking on single core. (diff)
downloadyuzu-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 '')
-rw-r--r--src/core/hle/kernel/k_thread.cpp21
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