|
@@ -604,7 +604,6 @@ void Scheduler::SwitchContextStep2() {
|
|
|
|
|
|
|
|
if (new_thread) {
|
|
if (new_thread) {
|
|
|
auto& cpu_core = system.ArmInterface(core_id);
|
|
auto& cpu_core = system.ArmInterface(core_id);
|
|
|
- new_thread->context_guard.lock();
|
|
|
|
|
cpu_core.Lock();
|
|
cpu_core.Lock();
|
|
|
ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
|
|
ASSERT_MSG(new_thread->GetSchedulingStatus() == ThreadSchedStatus::Runnable,
|
|
|
"Thread must be runnable.");
|
|
"Thread must be runnable.");
|
|
@@ -685,13 +684,24 @@ void Scheduler::OnSwitch(void* this_scheduler) {
|
|
|
|
|
|
|
|
void Scheduler::SwitchToCurrent() {
|
|
void Scheduler::SwitchToCurrent() {
|
|
|
while (true) {
|
|
while (true) {
|
|
|
- std::shared_ptr<Common::Fiber> next_context;
|
|
|
|
|
- if (current_thread != nullptr) {
|
|
|
|
|
- next_context = current_thread->GetHostContext();
|
|
|
|
|
- } else {
|
|
|
|
|
- next_context = idle_thread->GetHostContext();
|
|
|
|
|
|
|
+ guard.lock();
|
|
|
|
|
+ selected_thread = selected_thread_set;
|
|
|
|
|
+ current_thread = selected_thread;
|
|
|
|
|
+ guard.unlock();
|
|
|
|
|
+ while (!is_context_switch_pending) {
|
|
|
|
|
+ current_thread->context_guard.lock();
|
|
|
|
|
+ if (current_thread->GetSchedulingStatus() != ThreadSchedStatus::Runnable) {
|
|
|
|
|
+ current_thread->context_guard.unlock();
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ std::shared_ptr<Common::Fiber> next_context;
|
|
|
|
|
+ if (current_thread != nullptr) {
|
|
|
|
|
+ next_context = current_thread->GetHostContext();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ next_context = idle_thread->GetHostContext();
|
|
|
|
|
+ }
|
|
|
|
|
+ Common::Fiber::YieldTo(switch_fiber, next_context);
|
|
|
}
|
|
}
|
|
|
- Common::Fiber::YieldTo(switch_fiber, next_context);
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|