components/sched/
cooperative.rs1use core::mem::MaybeUninit;
19use kernel::component::Component;
20use kernel::process::ProcessArray;
21use kernel::scheduler::cooperative::{CoopProcessNode, CooperativeSched};
22
23#[macro_export]
24macro_rules! cooperative_component_static {
25    ($N:expr $(,)?) => {{
26        let coop_sched =
27            kernel::static_buf!(kernel::scheduler::cooperative::CooperativeSched<'static>);
28        let coop_nodes = kernel::static_buf!(
29            [core::mem::MaybeUninit<kernel::scheduler::cooperative::CoopProcessNode<'static>>; $N]
30        );
31
32        (coop_sched, coop_nodes)
33    };};
34}
35
36pub struct CooperativeComponent<const NUM_PROCS: usize> {
37    processes: &'static ProcessArray<NUM_PROCS>,
38}
39
40impl<const NUM_PROCS: usize> CooperativeComponent<NUM_PROCS> {
41    pub fn new(processes: &'static ProcessArray<NUM_PROCS>) -> CooperativeComponent<NUM_PROCS> {
42        CooperativeComponent { processes }
43    }
44}
45
46impl<const NUM_PROCS: usize> Component for CooperativeComponent<NUM_PROCS> {
47    type StaticInput = (
48        &'static mut MaybeUninit<CooperativeSched<'static>>,
49        &'static mut MaybeUninit<[MaybeUninit<CoopProcessNode<'static>>; NUM_PROCS]>,
50    );
51    type Output = &'static mut CooperativeSched<'static>;
52
53    fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output {
54        let scheduler = static_buffer.0.write(CooperativeSched::new());
55
56        let nodes = static_buffer
57            .1
58            .write([const { MaybeUninit::uninit() }; NUM_PROCS]);
59
60        for (i, node) in nodes.iter_mut().enumerate() {
61            let init_node = node.write(CoopProcessNode::new(&self.processes[i]));
62            scheduler.processes.push_head(init_node);
63        }
64        scheduler
65    }
66}