summaryrefslogtreecommitdiff
path: root/src/core/hle/kernel
diff options
context:
space:
mode:
authorGravatar bunnei2021-03-08 13:51:37 -0800
committerGravatar GitHub2021-03-08 13:51:37 -0800
commit69ce5e41ebd266b2cd04cb609663eaca21c8ded9 (patch)
treeed8f8429c89814266ac72db1fdf7591d03ab4c9a /src/core/hle/kernel
parentMerge pull request #6047 from lioncash/dynarmic (diff)
parentcommon: Fiber: use a reference for YieldTo. (diff)
downloadyuzu-69ce5e41ebd266b2cd04cb609663eaca21c8ded9.tar.gz
yuzu-69ce5e41ebd266b2cd04cb609663eaca21c8ded9.tar.xz
yuzu-69ce5e41ebd266b2cd04cb609663eaca21c8ded9.zip
Merge pull request #6041 from bunnei/fiber-leaks
common: fiber: Use weak_ptr when yielding.
Diffstat (limited to 'src/core/hle/kernel')
-rw-r--r--src/core/hle/kernel/k_scheduler.cpp11
1 files changed, 3 insertions, 8 deletions
diff --git a/src/core/hle/kernel/k_scheduler.cpp b/src/core/hle/kernel/k_scheduler.cpp
index 6e89c3042..e7de48476 100644
--- a/src/core/hle/kernel/k_scheduler.cpp
+++ b/src/core/hle/kernel/k_scheduler.cpp
@@ -734,7 +734,7 @@ void KScheduler::ScheduleImpl() {
734 } 734 }
735 guard.unlock(); 735 guard.unlock();
736 736
737 Common::Fiber::YieldTo(*old_context, switch_fiber); 737 Common::Fiber::YieldTo(*old_context, *switch_fiber);
738 /// When a thread wakes up, the scheduler may have changed to other in another core. 738 /// When a thread wakes up, the scheduler may have changed to other in another core.
739 auto& next_scheduler = *system.Kernel().CurrentScheduler(); 739 auto& next_scheduler = *system.Kernel().CurrentScheduler();
740 next_scheduler.SwitchContextStep2(); 740 next_scheduler.SwitchContextStep2();
@@ -769,13 +769,8 @@ void KScheduler::SwitchToCurrent() {
769 break; 769 break;
770 } 770 }
771 } 771 }
772 std::shared_ptr<Common::Fiber>* next_context; 772 auto thread = next_thread ? next_thread : idle_thread;
773 if (next_thread != nullptr) { 773 Common::Fiber::YieldTo(switch_fiber, *thread->GetHostContext());
774 next_context = &next_thread->GetHostContext();
775 } else {
776 next_context = &idle_thread->GetHostContext();
777 }
778 Common::Fiber::YieldTo(switch_fiber, *next_context);
779 } while (!is_switch_pending()); 774 } while (!is_switch_pending());
780 } 775 }
781} 776}