tg-rcore-tutorial-user 0.4.10

User-space apps for rCore Tutorial chapters (subset for ch2).
Documentation
#![no_std]
#![no_main]

#[macro_use]
extern crate user_lib;

use user_lib::{exec, fork, waitpid};

const TESTS: &[&str] = &[
    "00hello_world",
    "08power_3",
    "09power_5",
    "10power_7",
    "05write_a",
    "06write_b",
    "07write_c",
    "12forktest",
    "14forktest2",
    "fork_exit",
    "forktest_simple",
    "filetest_simple",
    "threads",
    "threads_arg",
    "mpsc_sem",
    "sync_sem",
    "race_adder_mutex_blocking",
    "phil_din_mutex",
    "test_condvar",
    "pipetest",
    "ch8_deadlock_mutex1",
    "ch8_deadlock_sem1",
    "ch8_deadlock_sem2",
];

const TEST_NUM: usize = TESTS.len();

// 教学目标:
// ch8 综合回归入口:覆盖线程、同步、死锁检测等高级实验能力。

#[unsafe(no_mangle)]
extern "C" fn main() -> i32 {
    let mut pids = [0isize; TEST_NUM];
    for (i, &test) in TESTS.iter().enumerate() {
        println!("Usertests: Running {}", test);
        let pid = fork();
        if pid == 0 {
            exec(test);
            panic!("unreachable!");
        } else {
            pids[i] = pid;
        }
    }
    let mut xstate: i32 = Default::default();
    for (i, &test) in TESTS.iter().enumerate() {
        let wait_pid = waitpid(pids[i], &mut xstate);
        assert_eq!(pids[i], wait_pid);
        println!(
            "\x1b[32mUsertests: Test {} in Process {} exited with code {}\x1b[0m",
            test, pids[i], xstate
        );
    }
    println!("ch8 Usertests passed!");
    0
}