27 auto& cpu_sched = GetCurrentCpuSched();
28 cpu_sched.scheduler_started =
true;
29 cpu_sched.lock.Lock().or_else([](
auto&& err) {
30 klog::Err(
"Schedule: Failed to acquire lock: {}", err.message());
37 auto* current = GetCurrentTask();
38 assert(current !=
nullptr &&
"Schedule: No current task to schedule");
45 cpu_sched.schedulers[
static_cast<uint8_t
>(current->policy)].get();
48 scheduler->OnPreempted(current);
51 if (scheduler->OnTimeSliceExpired(current)) {
52 scheduler->Enqueue(current);
59 for (
auto& scheduler : cpu_sched.schedulers) {
60 if (scheduler && !scheduler->IsEmpty()) {
61 next = scheduler->PickNext();
75 cpu_sched.idle_time++;
76 cpu_sched.lock.UnLock().or_else([](
auto&& err) {
77 klog::Err(
"Schedule: Failed to release lock: {}", err.message());
88 assert(next !=
nullptr &&
"Schedule: next task must not be null");
91 "Schedule: next task must be kReady or kIdle policy");
97 cpu_sched.total_schedules++;
101 cpu_sched.schedulers[
static_cast<uint8_t
>(next->
policy)].get();
103 scheduler->OnScheduled(next);
109 cpu_sched.lock.UnLock().or_else([](
auto&& err) {
110 klog::Err(
"Schedule: Failed to release lock: {}", err.message());
118 if (current != next) {