ahrightos-process 0.1.0

Portable process and scheduler primitives for the AhRightOS teaching kernel.
Documentation
use ahrightos_process::{ProcessControlBlock, ProcessId, ProcessState, RoundRobinScheduler};

#[test]
fn scheduler_contract_supports_parent_child_wait_flow() {
    let parent = ProcessId::from_usize(1);
    let mut scheduler = RoundRobinScheduler::new(1);

    let mut child = ProcessControlBlock::new(ProcessId::from_usize(2), "child", Some(parent));
    child.context_mut().set_sepc(0x1000);
    scheduler.add_process(Box::new(child)).unwrap();
    scheduler
        .add_process(Box::new(ProcessControlBlock::new(
            ProcessId::from_usize(3),
            "idle",
            None,
        )))
        .unwrap();

    let running = scheduler.schedule().expect("child scheduled");
    assert_eq!(running.state(), ProcessState::Running);
    running.set_exit_code(42);
    scheduler.schedule();

    assert_eq!(
        scheduler.find_zombie_child(parent),
        Some((ProcessId::from_usize(2), 42))
    );
}

#[test]
fn scheduler_normalizes_zero_time_slice_and_reaps_many_children() {
    let parent = ProcessId::from_usize(10);
    let mut scheduler = RoundRobinScheduler::new(0);
    for pid in 11..19 {
        scheduler
            .add_process(Box::new(ProcessControlBlock::new(
                ProcessId::from_usize(pid),
                "child",
                Some(parent),
            )))
            .unwrap();
    }

    for expected_pid in 11usize..19 {
        let running = scheduler.schedule().expect("child scheduled");
        assert_eq!(running.state(), ProcessState::Running);
        running.set_exit_code(expected_pid as i32);
    }
    scheduler.schedule();

    for expected_pid in 11usize..19 {
        let pid = ProcessId::from_usize(expected_pid);
        assert_eq!(
            scheduler.find_zombie_child(parent),
            Some((pid, expected_pid as i32))
        );
        assert!(scheduler.remove_zombie(pid));
    }
    assert!(!scheduler.has_living_children(parent));
}