#![no_std]
extern crate alloc;
use alloc::{boxed::Box, collections::VecDeque, vec::Vec};
use task::TaskRef;
pub struct Scheduler {
idle_task: TaskRef,
queue: VecDeque<TaskRef>,
}
impl Scheduler {
pub const fn new(idle_task: TaskRef) -> Self {
Self {
idle_task,
queue: VecDeque::new(),
}
}
}
impl task::scheduler::Scheduler for Scheduler {
fn next(&mut self) -> TaskRef {
if let Some((task_index, _)) = self
.queue
.iter()
.enumerate()
.find(|(_, task)| task.is_runnable())
{
let task = self.queue.swap_remove_front(task_index).unwrap();
self.queue.push_back(task.clone());
task
} else {
self.idle_task.clone()
}
}
fn busyness(&self) -> usize {
self.queue.len()
}
fn add(&mut self, task: TaskRef) {
self.queue.push_back(task);
}
fn remove(&mut self, task: &TaskRef) -> bool {
let mut task_index = None;
for (i, t) in self.queue.iter().enumerate() {
if t == task {
task_index = Some(i);
break;
}
}
if let Some(task_index) = task_index {
self.queue.remove(task_index);
true
} else {
false
}
}
fn as_priority_scheduler(&mut self) -> Option<&mut dyn task::scheduler::PriorityScheduler> {
None
}
fn drain(&mut self) -> Box<dyn Iterator<Item = TaskRef> + '_> {
Box::new(self.queue.drain(..))
}
fn tasks(&self) -> Vec<TaskRef> {
self.queue.clone().into()
}
}