summaryrefslogtreecommitdiff
path: root/src/core/cpu_manager.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2020-12-06 00:16:39 -0800
committerGravatar bunnei2020-12-06 00:27:13 -0800
commitd4ae0ae0e9077c41499bb6a1d4bed2e047312748 (patch)
treed23a00cc127b6f548e49ebb9179617149d76de29 /src/core/cpu_manager.cpp
parenthle: kernel: Thread: Various style fixes based on code review feedback. (diff)
downloadyuzu-d4ae0ae0e9077c41499bb6a1d4bed2e047312748.tar.gz
yuzu-d4ae0ae0e9077c41499bb6a1d4bed2e047312748.tar.xz
yuzu-d4ae0ae0e9077c41499bb6a1d4bed2e047312748.zip
core: cpu_manager: Fix a typo in PreemptSingleCore, which broke many games.
- We were reload'ing the old current scheduler, which may have changed.
Diffstat (limited to 'src/core/cpu_manager.cpp')
-rw-r--r--src/core/cpu_manager.cpp47
1 files changed, 26 insertions, 21 deletions
diff --git a/src/core/cpu_manager.cpp b/src/core/cpu_manager.cpp
index 179154348..373395047 100644
--- a/src/core/cpu_manager.cpp
+++ b/src/core/cpu_manager.cpp
@@ -254,29 +254,34 @@ void CpuManager::SingleCoreRunSuspendThread() {
254} 254}
255 255
256void CpuManager::PreemptSingleCore(bool from_running_enviroment) { 256void CpuManager::PreemptSingleCore(bool from_running_enviroment) {
257 std::size_t old_core = current_core; 257 {
258 auto& scheduler = system.Kernel().Scheduler(old_core); 258 auto& scheduler = system.Kernel().Scheduler(current_core);
259 Kernel::Thread* current_thread = scheduler.GetCurrentThread(); 259 Kernel::Thread* current_thread = scheduler.GetCurrentThread();
260 if (idle_count >= 4 || from_running_enviroment) { 260 if (idle_count >= 4 || from_running_enviroment) {
261 if (!from_running_enviroment) { 261 if (!from_running_enviroment) {
262 system.CoreTiming().Idle(); 262 system.CoreTiming().Idle();
263 idle_count = 0; 263 idle_count = 0;
264 }
265 current_thread->SetPhantomMode(true);
266 system.CoreTiming().Advance();
267 current_thread->SetPhantomMode(false);
264 } 268 }
265 current_thread->SetPhantomMode(true); 269 current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES);
266 system.CoreTiming().Advance(); 270 system.CoreTiming().ResetTicks();
267 current_thread->SetPhantomMode(false); 271 scheduler.Unload(scheduler.GetCurrentThread());
272
273 auto& next_scheduler = system.Kernel().Scheduler(current_core);
274 Common::Fiber::YieldTo(current_thread->GetHostContext(), next_scheduler.ControlContext());
268 } 275 }
269 current_core.store((current_core + 1) % Core::Hardware::NUM_CPU_CORES); 276
270 system.CoreTiming().ResetTicks(); 277 // May have changed scheduler
271 scheduler.Unload(scheduler.GetCurrentThread()); 278 {
272 auto& next_scheduler = system.Kernel().Scheduler(current_core); 279 auto& scheduler = system.Kernel().Scheduler(current_core);
273 Common::Fiber::YieldTo(current_thread->GetHostContext(), next_scheduler.ControlContext()); 280 scheduler.Reload(scheduler.GetCurrentThread());
274 /// May have changed scheduler 281 auto* currrent_thread2 = scheduler.GetCurrentThread();
275 auto& current_scheduler = system.Kernel().Scheduler(current_core); 282 if (!currrent_thread2->IsIdleThread()) {
276 current_scheduler.Reload(scheduler.GetCurrentThread()); 283 idle_count = 0;
277 auto* currrent_thread2 = current_scheduler.GetCurrentThread(); 284 }
278 if (!currrent_thread2->IsIdleThread()) {
279 idle_count = 0;
280 } 285 }
281} 286}
282 287