1use crate::{
7 arch::Trapframe,
8 task::mytask,
9 ipc::pipe::UnidirectionalPipe,
10};
11
12pub fn sys_pipe(trapframe: &mut Trapframe) -> usize {
25 let task = match mytask() {
26 Some(task) => task,
27 None => return usize::MAX,
28 };
29
30 let pipefd_ptr = trapframe.get_arg(0);
31
32 trapframe.increment_pc_next(task);
34
35 let pipefd_vaddr = match task.vm_manager.translate_vaddr(pipefd_ptr) {
37 Some(addr) => addr as *mut u32,
38 None => return usize::MAX, };
40
41 const DEFAULT_PIPE_BUFFER_SIZE: usize = 4096;
43 let (read_obj, write_obj) = UnidirectionalPipe::create_pair(DEFAULT_PIPE_BUFFER_SIZE);
44
45 use crate::object::handle::{HandleMetadata, HandleType, AccessMode};
47
48 let read_metadata = HandleMetadata {
49 handle_type: HandleType::IpcChannel,
50 access_mode: AccessMode::ReadOnly,
51 special_semantics: None,
52 };
53
54 let write_metadata = HandleMetadata {
55 handle_type: HandleType::IpcChannel,
56 access_mode: AccessMode::WriteOnly,
57 special_semantics: None,
58 };
59
60 let read_handle = match task.handle_table.insert_with_metadata(read_obj, read_metadata) {
61 Ok(handle) => handle,
62 Err(_) => return usize::MAX, };
64
65 let write_handle = match task.handle_table.insert_with_metadata(write_obj, write_metadata) {
66 Ok(handle) => handle,
67 Err(_) => {
68 let _ = task.handle_table.remove(read_handle);
70 return usize::MAX;
71 }
72 };
73
74 unsafe {
76 *pipefd_vaddr = read_handle;
77 *pipefd_vaddr.add(1) = write_handle;
78 }
79
80 0 }
82
83pub fn sys_pipe2(trapframe: &mut Trapframe) -> usize {
88 let _pipefd_ptr = trapframe.get_arg(0);
89 let _flags = trapframe.get_arg(1);
90
91 sys_pipe(trapframe)
94}