1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
//! Various scheduler algorithms in a unified interface.
//!
//! Currently supported algorithms:
//!
//! - [`FifoScheduler`]: FIFO (First-In-First-Out) scheduler (cooperative).
//! - [`RRScheduler`]: Round-robin scheduler (preemptive).
//! - [`CFScheduler`]: Completely Fair Scheduler (preemptive).
#![cfg_attr(not(test), no_std)]
#![feature(const_mut_refs)]
mod cfs;
mod fifo;
mod round_robin;
#[cfg(test)]
mod tests;
extern crate alloc;
pub use cfs::{CFSTask, CFScheduler};
pub use fifo::{FifoScheduler, FifoTask};
pub use round_robin::{RRScheduler, RRTask};
/// The base scheduler trait that all schedulers should implement.
///
/// All tasks in the scheduler are considered runnable. If a task is go to
/// sleep, it should be removed from the scheduler.
pub trait BaseScheduler {
/// Type of scheduled entities. Often a task struct.
type SchedItem;
/// Initializes the scheduler.
fn init(&mut self);
/// Adds a task to the scheduler.
fn add_task(&mut self, task: Self::SchedItem);
/// Removes a task by its reference from the scheduler. Returns the owned
/// removed task with ownership if it exists.
///
/// # Safety
///
/// The caller should ensure that the task is in the scheduler, otherwise
/// the behavior is undefined.
fn remove_task(&mut self, task: &Self::SchedItem) -> Option<Self::SchedItem>;
/// Picks the next task to run, it will be removed from the scheduler.
/// Returns [`None`] if there is not runnable task.
fn pick_next_task(&mut self) -> Option<Self::SchedItem>;
/// Puts the previous task back to the scheduler. The previous task is
/// usually placed at the end of the ready queue, making it less likely
/// to be re-scheduled.
///
/// `preempt` indicates whether the previous task is preempted by the next
/// task. In this case, the previous task may be placed at the front of the
/// ready queue.
fn put_prev_task(&mut self, prev: Self::SchedItem, preempt: bool);
/// Advances the scheduler state at each timer tick. Returns `true` if
/// re-scheduling is required.
///
/// `current` is the current running task.
fn task_tick(&mut self, current: &Self::SchedItem) -> bool;
/// set priority for a task
fn set_priority(&mut self, task: &Self::SchedItem, prio: isize) -> bool;
}