diff options
| author | 2021-03-08 13:51:37 -0800 | |
|---|---|---|
| committer | 2021-03-08 13:51:37 -0800 | |
| commit | 69ce5e41ebd266b2cd04cb609663eaca21c8ded9 (patch) | |
| tree | ed8f8429c89814266ac72db1fdf7591d03ab4c9a /src/core/hle/kernel | |
| parent | Merge pull request #6047 from lioncash/dynarmic (diff) | |
| parent | common: Fiber: use a reference for YieldTo. (diff) | |
| download | yuzu-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.cpp | 11 |
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 | } |