summaryrefslogtreecommitdiff
path: root/src/core/cpu_manager.cpp
diff options
context:
space:
mode:
authorGravatar Liam2022-06-16 10:35:52 -0400
committerGravatar Liam2022-06-23 00:28:00 -0400
commit2c56e94702e897c609711d82057d8267d8f4d0b3 (patch)
treeb037c6951383408517b460577b709f4383a61da0 /src/core/cpu_manager.cpp
parentMerge pull request #8491 from Morph1984/extra-assert (diff)
downloadyuzu-2c56e94702e897c609711d82057d8267d8f4d0b3.tar.gz
yuzu-2c56e94702e897c609711d82057d8267d8f4d0b3.tar.xz
yuzu-2c56e94702e897c609711d82057d8267d8f4d0b3.zip
kernel: make current thread pointer thread local
Diffstat (limited to 'src/core/cpu_manager.cpp')
-rw-r--r--src/core/cpu_manager.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index d69b2602a..fd6928105 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -95,7 +95,7 @@ void* CpuManager::GetStartFuncParameter() {
95void CpuManager::MultiCoreRunGuestThread() { 95void CpuManager::MultiCoreRunGuestThread() {
96 auto& kernel = system.Kernel(); 96 auto& kernel = system.Kernel();
97 kernel.CurrentScheduler()->OnThreadStart(); 97 kernel.CurrentScheduler()->OnThreadStart();
98 auto* thread = kernel.CurrentScheduler()->GetCurrentThread(); 98 auto* thread = kernel.CurrentScheduler()->GetSchedulerCurrentThread();
99 auto& host_context = thread->GetHostContext(); 99 auto& host_context = thread->GetHostContext();
100 host_context->SetRewindPoint(GuestRewindFunction, this); 100 host_context->SetRewindPoint(GuestRewindFunction, this);
101 MultiCoreRunGuestLoop(); 101 MultiCoreRunGuestLoop();
@@ -132,7 +132,7 @@ void CpuManager::MultiCoreRunIdleThread() {
132void CpuManager::SingleCoreRunGuestThread() { 132void CpuManager::SingleCoreRunGuestThread() {
133 auto& kernel = system.Kernel(); 133 auto& kernel = system.Kernel();
134 kernel.CurrentScheduler()->OnThreadStart(); 134 kernel.CurrentScheduler()->OnThreadStart();
135 auto* thread = kernel.CurrentScheduler()->GetCurrentThread(); 135 auto* thread = kernel.CurrentScheduler()->GetSchedulerCurrentThread();
136 auto& host_context = thread->GetHostContext(); 136 auto& host_context = thread->GetHostContext();
137 host_context->SetRewindPoint(GuestRewindFunction, this); 137 host_context->SetRewindPoint(GuestRewindFunction, this);
138 SingleCoreRunGuestLoop(); 138 SingleCoreRunGuestLoop();
@@ -172,7 +172,7 @@ void CpuManager::PreemptSingleCore(bool from_running_enviroment) {
172 { 172 {
173 auto& kernel = system.Kernel(); 173 auto& kernel = system.Kernel();
174 auto& scheduler = kernel.Scheduler(current_core); 174 auto& scheduler = kernel.Scheduler(current_core);
175 Kernel::KThread* current_thread = scheduler.GetCurrentThread(); 175 Kernel::KThread* current_thread = scheduler.GetSchedulerCurrentThread();
176 if (idle_count >= 4 || from_running_enviroment) { 176 if (idle_count >= 4 || from_running_enviroment) {
177 if (!from_running_enviroment) { 177 if (!from_running_enviroment) {
178 system.CoreTiming().Idle(); 178 system.CoreTiming().Idle();
@@ -184,7 +184,7 @@ void CpuManager::PreemptSingleCore(bool from_running_enviroment) {
184 } 184 }
185 current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); 185 current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES);
186 system.CoreTiming().ResetTicks(); 186 system.CoreTiming().ResetTicks();
187 scheduler.Unload(scheduler.GetCurrentThread()); 187 scheduler.Unload(scheduler.GetSchedulerCurrentThread());
188 188
189 auto& next_scheduler = kernel.Scheduler(current_core); 189 auto& next_scheduler = kernel.Scheduler(current_core);
190 Common::Fiber::YieldTo(current_thread->GetHostContext(), *next_scheduler.ControlContext()); 190 Common::Fiber::YieldTo(current_thread->GetHostContext(), *next_scheduler.ControlContext());
@@ -193,10 +193,8 @@ void CpuManager::PreemptSingleCore(bool from_running_enviroment) {
193 // May have changed scheduler 193 // May have changed scheduler
194 { 194 {
195 auto& scheduler = system.Kernel().Scheduler(current_core); 195 auto& scheduler = system.Kernel().Scheduler(current_core);
196 scheduler.Reload(scheduler.GetCurrentThread()); 196 scheduler.Reload(scheduler.GetSchedulerCurrentThread());
197 if (!scheduler.IsIdle()) { 197 idle_count = 0;
198 idle_count = 0;
199 }
200 } 198 }
201} 199}
202 200
@@ -237,7 +235,8 @@ void CpuManager::RunThread(std::size_t core) {
237 system.GPU().ObtainContext(); 235 system.GPU().ObtainContext();
238 } 236 }
239 237
240 auto current_thread = system.Kernel().CurrentScheduler()->GetCurrentThread(); 238 auto* current_thread = system.Kernel().CurrentScheduler()->GetIdleThread();
239 Kernel::SetCurrentThread(system.Kernel(), current_thread);
241 Common::Fiber::YieldTo(data.host_context, *current_thread->GetHostContext()); 240 Common::Fiber::YieldTo(data.host_context, *current_thread->GetHostContext());
242} 241}
243 242