Struct kernel::scheduler::Scheduler

source ·
pub struct Scheduler<P>
where P: Platform,
{ pub tasklet_scheduler: TaskletScheduler, /* private fields */ }
Expand description

The global Scheduler coordinates the main ‘run loop’ of the kernel, allocating CPU time to userspace tasks. There is one global Scheduler instance, which then holds a CpuScheduler for each running processor to coordinate tasks running on that processor.

It is also responsible for managing spawned kernel asynchronous tasklets (which are somewhat confusingly also often called Tasks) - this involves tracking tasks that have been ‘woken’ (are ready to make progress) and making sure they are polled regularly. The forward progress of both userspace tasks and kernel tasklets are intertwined, and so are managed together.

Fields§

§tasklet_scheduler: TaskletScheduler

Implementations§

source§

impl<P> Scheduler<P>
where P: Platform,

source

pub fn new() -> Scheduler<P>

source

pub fn add_task(&self, task: Arc<Task<P>>)

source

pub fn for_this_cpu(&self) -> SpinlockGuard<'_, CpuScheduler<P>>

source

pub fn start_scheduling(&self) -> !

Start scheduling! This should be called after a platform has finished initializing, and is diverging. It gives kernel tasklets an initial poll while we’re here in the kernel, and then drops down into userspace.

source

pub fn schedule(&self, new_state: TaskState)

Called when a userspace task yields or is pre-empted. This is responsible for the ‘scheduling’ part of the scheduler - it polls kernel tasklets as they need attention, and shares CPU time between userspace tasks.

On each call to schedule, the kernel can choose to:

  • Give CPU time to the kernel-space tasklet scheduler
  • Switch to another userspace task
  • Steal work from another CPU’s scheduler
  • Idle the CPU, if there is nothing to be done
  • Nothing

If the current task is switched away from, it will be placed in the state new_state. This allows the caller to block the current task on a dependency. If a task has been pre-empted or yields, it should be placed into TaskState::Ready.

Auto Trait Implementations§

§

impl<P> !Freeze for Scheduler<P>

§

impl<P> !RefUnwindSafe for Scheduler<P>

§

impl<P> Send for Scheduler<P>

§

impl<P> Sync for Scheduler<P>

§

impl<P> Unpin for Scheduler<P>

§

impl<P> !UnwindSafe for Scheduler<P>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Downcast for T
where T: Any,

source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<dyn Any>. Rc<dyn Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Anydyn Any. This is needed since Rust cannot generate &Anydyn Any’s vtable from &Trait’s.
source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Anydyn Any. This is needed since Rust cannot generate &mut dyn Any’s vtable from &mut Trait’s.
source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<dyn Any>. Arc<dyn Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.