#![no_std]
#![no_main]
#[macro_use]
extern crate user_lib;
extern crate alloc;
use alloc::format;
use user_lib::{close, fork, getpid, pipe, pipe_read, pipe_write, wait};
const LENGTH: usize = 3000;
#[unsafe(no_mangle)]
pub extern "C" fn main() -> i32 {
let mut down_pipe_fd = [0usize; 2];
let mut up_pipe_fd = [0usize; 2];
pipe(&mut down_pipe_fd);
pipe(&mut up_pipe_fd);
let mut random_str = [0u8; LENGTH];
if fork() == 0 {
close(down_pipe_fd[1]);
close(up_pipe_fd[0]);
assert_eq!(pipe_read(down_pipe_fd[0], &mut random_str) as usize, LENGTH);
close(down_pipe_fd[0]);
let sum: usize = random_str.iter().map(|v| *v as usize).sum::<usize>();
println!("sum = {}(child)", sum);
let sum_str = format!("{}", sum);
pipe_write(up_pipe_fd[1], sum_str.as_bytes());
close(up_pipe_fd[1]);
println!("Child process exited!");
0
} else {
close(down_pipe_fd[0]);
close(up_pipe_fd[1]);
for ch in random_str.iter_mut().take(LENGTH) {
*ch = getpid() as u8;
}
assert_eq!(
pipe_write(down_pipe_fd[1], &random_str) as usize,
random_str.len()
);
close(down_pipe_fd[1]);
let sum: usize = random_str.iter().map(|v| *v as usize).sum::<usize>();
println!("sum = {}(parent)", sum);
let mut child_result = [0u8; 32];
let result_len = pipe_read(up_pipe_fd[0], &mut child_result) as usize;
close(up_pipe_fd[0]);
assert_eq!(
sum,
str::parse::<usize>(core::str::from_utf8(&child_result[..result_len]).unwrap())
.unwrap()
);
let mut _unused: i32 = 0;
wait(&mut _unused);
println!("pipe_large_test passed!");
0
}
}