1f678331aShanjiezhou use crate::{ 2f678331aShanjiezhou filesystem::vfs::{ 36b4e7a29SLoGin core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem, 440609970SGnoCiYeH FileType, IndexNode, Metadata, 5f678331aShanjiezhou }, 6dfe53cf0SGnoCiYeH libs::{ 7dfe53cf0SGnoCiYeH spinlock::{SpinLock, SpinLockGuard}, 8dfe53cf0SGnoCiYeH wait_queue::WaitQueue, 9dfe53cf0SGnoCiYeH }, 105e948c56SGnoCiYeH net::event_poll::{EPollEventType, EPollItem, EventPoll}, 111496ba7bSLoGin process::ProcessState, 12*dc9b4feaSLoGin sched::SchedMode, 136fc066acSJomo time::PosixTimeSpec, 14f678331aShanjiezhou }; 15f678331aShanjiezhou 165e948c56SGnoCiYeH use alloc::{ 175e948c56SGnoCiYeH collections::LinkedList, 185e948c56SGnoCiYeH sync::{Arc, Weak}, 194afc5b7bSlinfeng vec::Vec, 205e948c56SGnoCiYeH }; 2191e9d4abSLoGin use system_error::SystemError; 22f678331aShanjiezhou 23f678331aShanjiezhou /// 我们设定pipe_buff的总大小为1024字节 24f678331aShanjiezhou const PIPE_BUFF_SIZE: usize = 1024; 25f678331aShanjiezhou 26876cb89eSGnoCiYeH #[derive(Debug, Clone)] 27876cb89eSGnoCiYeH pub struct PipeFsPrivateData { 28876cb89eSGnoCiYeH mode: FileMode, 29876cb89eSGnoCiYeH } 30876cb89eSGnoCiYeH 31876cb89eSGnoCiYeH impl PipeFsPrivateData { new(mode: FileMode) -> Self32876cb89eSGnoCiYeH pub fn new(mode: FileMode) -> Self { 334ad52e57S裕依2439 return PipeFsPrivateData { mode }; 34876cb89eSGnoCiYeH } 355e948c56SGnoCiYeH set_mode(&mut self, mode: FileMode)365e948c56SGnoCiYeH pub fn set_mode(&mut self, mode: FileMode) { 375e948c56SGnoCiYeH self.mode = mode; 385e948c56SGnoCiYeH } 39876cb89eSGnoCiYeH } 40876cb89eSGnoCiYeH 41f678331aShanjiezhou /// @brief 管道文件i节点(锁) 42f678331aShanjiezhou #[derive(Debug)] 43dfe53cf0SGnoCiYeH pub struct LockedPipeInode { 44dfe53cf0SGnoCiYeH inner: SpinLock<InnerPipeInode>, 45dfe53cf0SGnoCiYeH read_wait_queue: WaitQueue, 46dfe53cf0SGnoCiYeH write_wait_queue: WaitQueue, 47dfe53cf0SGnoCiYeH } 48f678331aShanjiezhou 49f678331aShanjiezhou /// @brief 管道文件i节点(无锁) 50f678331aShanjiezhou #[derive(Debug)] 51f678331aShanjiezhou pub struct InnerPipeInode { 52f678331aShanjiezhou self_ref: Weak<LockedPipeInode>, 535e948c56SGnoCiYeH /// 管道内可读的数据数 54f678331aShanjiezhou valid_cnt: i32, 55f678331aShanjiezhou read_pos: i32, 56f678331aShanjiezhou write_pos: i32, 57f678331aShanjiezhou data: [u8; PIPE_BUFF_SIZE], 58f678331aShanjiezhou /// INode 元数据 59f678331aShanjiezhou metadata: Metadata, 60876cb89eSGnoCiYeH reader: u32, 61876cb89eSGnoCiYeH writer: u32, 625e948c56SGnoCiYeH epitems: SpinLock<LinkedList<Arc<EPollItem>>>, 635e948c56SGnoCiYeH } 645e948c56SGnoCiYeH 655e948c56SGnoCiYeH impl InnerPipeInode { poll(&self, private_data: &FilePrivateData) -> Result<usize, SystemError>665e948c56SGnoCiYeH pub fn poll(&self, private_data: &FilePrivateData) -> Result<usize, SystemError> { 675e948c56SGnoCiYeH let mut events = EPollEventType::empty(); 685e948c56SGnoCiYeH 695e948c56SGnoCiYeH let mode = if let FilePrivateData::Pipefs(PipeFsPrivateData { mode }) = private_data { 705e948c56SGnoCiYeH mode 715e948c56SGnoCiYeH } else { 725e948c56SGnoCiYeH return Err(SystemError::EBADFD); 735e948c56SGnoCiYeH }; 745e948c56SGnoCiYeH 755e948c56SGnoCiYeH if mode.contains(FileMode::O_RDONLY) { 765e948c56SGnoCiYeH if self.valid_cnt != 0 { 775e948c56SGnoCiYeH // 有数据可读 785e948c56SGnoCiYeH events.insert(EPollEventType::EPOLLIN & EPollEventType::EPOLLRDNORM); 795e948c56SGnoCiYeH } 805e948c56SGnoCiYeH 815e948c56SGnoCiYeH // 没有写者 825e948c56SGnoCiYeH if self.writer == 0 { 835e948c56SGnoCiYeH events.insert(EPollEventType::EPOLLHUP) 845e948c56SGnoCiYeH } 855e948c56SGnoCiYeH } 865e948c56SGnoCiYeH 875e948c56SGnoCiYeH if mode.contains(FileMode::O_WRONLY) { 885e948c56SGnoCiYeH // 管道内数据未满 895e948c56SGnoCiYeH if self.valid_cnt as usize != PIPE_BUFF_SIZE { 905e948c56SGnoCiYeH events.insert(EPollEventType::EPOLLIN & EPollEventType::EPOLLWRNORM); 915e948c56SGnoCiYeH } 925e948c56SGnoCiYeH 935e948c56SGnoCiYeH // 没有读者 945e948c56SGnoCiYeH if self.reader == 0 { 955e948c56SGnoCiYeH events.insert(EPollEventType::EPOLLERR); 965e948c56SGnoCiYeH } 975e948c56SGnoCiYeH } 985e948c56SGnoCiYeH 995e948c56SGnoCiYeH Ok(events.bits() as usize) 1005e948c56SGnoCiYeH } 1015e948c56SGnoCiYeH add_epoll(&mut self, epitem: Arc<EPollItem>) -> Result<(), SystemError>1025e948c56SGnoCiYeH pub fn add_epoll(&mut self, epitem: Arc<EPollItem>) -> Result<(), SystemError> { 1035e948c56SGnoCiYeH self.epitems.lock().push_back(epitem); 1045e948c56SGnoCiYeH Ok(()) 1055e948c56SGnoCiYeH } 1064afc5b7bSlinfeng buf_full(&self) -> bool107*dc9b4feaSLoGin fn buf_full(&self) -> bool { 108*dc9b4feaSLoGin return self.valid_cnt as usize == PIPE_BUFF_SIZE; 109*dc9b4feaSLoGin } 110*dc9b4feaSLoGin remove_epoll(&self, epoll: &Weak<SpinLock<EventPoll>>) -> Result<(), SystemError>1114afc5b7bSlinfeng pub fn remove_epoll(&self, epoll: &Weak<SpinLock<EventPoll>>) -> Result<(), SystemError> { 1124afc5b7bSlinfeng let is_remove = !self 1134afc5b7bSlinfeng .epitems 1144afc5b7bSlinfeng .lock_irqsave() 1154afc5b7bSlinfeng .extract_if(|x| x.epoll().ptr_eq(epoll)) 1164afc5b7bSlinfeng .collect::<Vec<_>>() 1174afc5b7bSlinfeng .is_empty(); 1184afc5b7bSlinfeng 1194afc5b7bSlinfeng if is_remove { 1204afc5b7bSlinfeng return Ok(()); 1214afc5b7bSlinfeng } 1224afc5b7bSlinfeng 1234afc5b7bSlinfeng Err(SystemError::ENOENT) 1244afc5b7bSlinfeng } 125f678331aShanjiezhou } 126f678331aShanjiezhou 127f678331aShanjiezhou impl LockedPipeInode { new() -> Arc<Self>128876cb89eSGnoCiYeH pub fn new() -> Arc<Self> { 129f678331aShanjiezhou let inner = InnerPipeInode { 130f678331aShanjiezhou self_ref: Weak::default(), 131f678331aShanjiezhou valid_cnt: 0, 132f678331aShanjiezhou read_pos: 0, 133f678331aShanjiezhou write_pos: 0, 134f678331aShanjiezhou data: [0; PIPE_BUFF_SIZE], 135f678331aShanjiezhou 136f678331aShanjiezhou metadata: Metadata { 137f678331aShanjiezhou dev_id: 0, 138f678331aShanjiezhou inode_id: generate_inode_id(), 13922c9db31Shanjiezhou size: PIPE_BUFF_SIZE as i64, 140f678331aShanjiezhou blk_size: 0, 141f678331aShanjiezhou blocks: 0, 1426fc066acSJomo atime: PosixTimeSpec::default(), 1436fc066acSJomo mtime: PosixTimeSpec::default(), 1446fc066acSJomo ctime: PosixTimeSpec::default(), 145f678331aShanjiezhou file_type: FileType::Pipe, 1466b4e7a29SLoGin mode: ModeType::from_bits_truncate(0o666), 147f678331aShanjiezhou nlinks: 1, 148f678331aShanjiezhou uid: 0, 149f678331aShanjiezhou gid: 0, 15002343d0bSLoGin raw_dev: Default::default(), 151f678331aShanjiezhou }, 152876cb89eSGnoCiYeH reader: 0, 153876cb89eSGnoCiYeH writer: 0, 1545e948c56SGnoCiYeH epitems: SpinLock::new(LinkedList::new()), 155f678331aShanjiezhou }; 156dfe53cf0SGnoCiYeH let result = Arc::new(Self { 157dfe53cf0SGnoCiYeH inner: SpinLock::new(inner), 158dfe53cf0SGnoCiYeH read_wait_queue: WaitQueue::default(), 159dfe53cf0SGnoCiYeH write_wait_queue: WaitQueue::default(), 160dfe53cf0SGnoCiYeH }); 161dfe53cf0SGnoCiYeH let mut guard = result.inner.lock(); 162f678331aShanjiezhou guard.self_ref = Arc::downgrade(&result); 163f678331aShanjiezhou // 释放锁 164f678331aShanjiezhou drop(guard); //这一步其实不需要,只要离开作用域,guard生命周期结束,自会解锁 165f678331aShanjiezhou return result; 166f678331aShanjiezhou } 1675e948c56SGnoCiYeH inner(&self) -> &SpinLock<InnerPipeInode>1685e948c56SGnoCiYeH pub fn inner(&self) -> &SpinLock<InnerPipeInode> { 169dfe53cf0SGnoCiYeH &self.inner 1705e948c56SGnoCiYeH } 171*dc9b4feaSLoGin readable(&self) -> bool172*dc9b4feaSLoGin fn readable(&self) -> bool { 173*dc9b4feaSLoGin let inode = self.inner.lock(); 174*dc9b4feaSLoGin return inode.valid_cnt > 0 || inode.writer == 0; 175*dc9b4feaSLoGin } 176*dc9b4feaSLoGin writeable(&self) -> bool177*dc9b4feaSLoGin fn writeable(&self) -> bool { 178*dc9b4feaSLoGin let inode = self.inner.lock(); 179*dc9b4feaSLoGin return !inode.buf_full() || inode.reader == 0; 180*dc9b4feaSLoGin } 181f678331aShanjiezhou } 182f678331aShanjiezhou 183f678331aShanjiezhou impl IndexNode for LockedPipeInode { read_at( &self, _offset: usize, len: usize, buf: &mut [u8], data_guard: SpinLockGuard<FilePrivateData>, ) -> Result<usize, SystemError>184f678331aShanjiezhou fn read_at( 185f678331aShanjiezhou &self, 186f678331aShanjiezhou _offset: usize, 187f678331aShanjiezhou len: usize, 188f678331aShanjiezhou buf: &mut [u8], 1893959e94dS曾俊 data_guard: SpinLockGuard<FilePrivateData>, 19091e9d4abSLoGin ) -> Result<usize, SystemError> { 1913959e94dS曾俊 let data = data_guard.clone(); 1923959e94dS曾俊 drop(data_guard); 193876cb89eSGnoCiYeH // 获取mode 194876cb89eSGnoCiYeH let mode: FileMode; 1953959e94dS曾俊 if let FilePrivateData::Pipefs(pdata) = &data { 196876cb89eSGnoCiYeH mode = pdata.mode; 197876cb89eSGnoCiYeH } else { 198876cb89eSGnoCiYeH return Err(SystemError::EBADF); 199876cb89eSGnoCiYeH } 200876cb89eSGnoCiYeH 201f678331aShanjiezhou if buf.len() < len { 202f678331aShanjiezhou return Err(SystemError::EINVAL); 203f678331aShanjiezhou } 204*dc9b4feaSLoGin // log::debug!("pipe mode: {:?}", mode); 205f678331aShanjiezhou // 加锁 206dfe53cf0SGnoCiYeH let mut inode = self.inner.lock(); 207f678331aShanjiezhou 208f678331aShanjiezhou // 如果管道里面没有数据,则唤醒写端, 209f678331aShanjiezhou while inode.valid_cnt == 0 { 210876cb89eSGnoCiYeH // 如果当前管道写者数为0,则返回EOF 211876cb89eSGnoCiYeH if inode.writer == 0 { 212876cb89eSGnoCiYeH return Ok(0); 213876cb89eSGnoCiYeH } 214876cb89eSGnoCiYeH 215dfe53cf0SGnoCiYeH self.write_wait_queue 2161496ba7bSLoGin .wakeup(Some(ProcessState::Blocked(true))); 2171496ba7bSLoGin 21822c9db31Shanjiezhou // 如果为非阻塞管道,直接返回错误 219876cb89eSGnoCiYeH if mode.contains(FileMode::O_NONBLOCK) { 22022c9db31Shanjiezhou drop(inode); 22122c9db31Shanjiezhou return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 22222c9db31Shanjiezhou } 2231496ba7bSLoGin 22422c9db31Shanjiezhou // 否则在读等待队列中睡眠,并释放锁 225f678331aShanjiezhou drop(inode); 226*dc9b4feaSLoGin let r = wq_wait_event_interruptible!(self.read_wait_queue, self.readable(), {}); 227*dc9b4feaSLoGin if r.is_err() { 228*dc9b4feaSLoGin return Err(SystemError::ERESTARTSYS); 229f678331aShanjiezhou } 230*dc9b4feaSLoGin 231dfe53cf0SGnoCiYeH inode = self.inner.lock(); 232f678331aShanjiezhou } 233f678331aShanjiezhou 234f678331aShanjiezhou let mut num = inode.valid_cnt as usize; 235f678331aShanjiezhou //决定要输出的字节 236f678331aShanjiezhou let start = inode.read_pos as usize; 237f678331aShanjiezhou //如果读端希望读取的字节数大于有效字节数,则输出有效字节 238f678331aShanjiezhou let mut end = (inode.valid_cnt as usize + inode.read_pos as usize) % PIPE_BUFF_SIZE; 239f678331aShanjiezhou //如果读端希望读取的字节数少于有效字节数,则输出希望读取的字节 240f678331aShanjiezhou if len < inode.valid_cnt as usize { 241f678331aShanjiezhou end = (len + inode.read_pos as usize) % PIPE_BUFF_SIZE; 242f678331aShanjiezhou num = len; 243f678331aShanjiezhou } 244f678331aShanjiezhou 245f678331aShanjiezhou // 从管道拷贝数据到用户的缓冲区 246f678331aShanjiezhou 247f678331aShanjiezhou if end < start { 248f678331aShanjiezhou buf[0..(PIPE_BUFF_SIZE - start)].copy_from_slice(&inode.data[start..PIPE_BUFF_SIZE]); 249f678331aShanjiezhou buf[(PIPE_BUFF_SIZE - start)..num].copy_from_slice(&inode.data[0..end]); 250f678331aShanjiezhou } else { 251f678331aShanjiezhou buf[0..num].copy_from_slice(&inode.data[start..end]); 252f678331aShanjiezhou } 253f678331aShanjiezhou 254f678331aShanjiezhou //更新读位置以及valid_cnt 255f678331aShanjiezhou inode.read_pos = (inode.read_pos + num as i32) % PIPE_BUFF_SIZE as i32; 256f678331aShanjiezhou inode.valid_cnt -= num as i32; 257f678331aShanjiezhou 2585e948c56SGnoCiYeH // 读完以后如果未读完,则唤醒下一个读者 2595e948c56SGnoCiYeH if inode.valid_cnt > 0 { 260dfe53cf0SGnoCiYeH self.read_wait_queue 2615e948c56SGnoCiYeH .wakeup(Some(ProcessState::Blocked(true))); 2625e948c56SGnoCiYeH } 2635e948c56SGnoCiYeH 264f678331aShanjiezhou //读完后解锁并唤醒等待在写等待队列中的进程 265dfe53cf0SGnoCiYeH self.write_wait_queue 2661496ba7bSLoGin .wakeup(Some(ProcessState::Blocked(true))); 2675e948c56SGnoCiYeH 268dfe53cf0SGnoCiYeH let pollflag = EPollEventType::from_bits_truncate(inode.poll(&data)? as u32); 2695e948c56SGnoCiYeH // 唤醒epoll中等待的进程 270b5b571e0SLoGin EventPoll::wakeup_epoll(&inode.epitems, pollflag)?; 2715e948c56SGnoCiYeH 272f678331aShanjiezhou //返回读取的字节数 273f678331aShanjiezhou return Ok(num); 274f678331aShanjiezhou } 275f678331aShanjiezhou open( &self, mut data: SpinLockGuard<FilePrivateData>, mode: &crate::filesystem::vfs::file::FileMode, ) -> Result<(), SystemError>276f678331aShanjiezhou fn open( 277f678331aShanjiezhou &self, 278dfe53cf0SGnoCiYeH mut data: SpinLockGuard<FilePrivateData>, 279876cb89eSGnoCiYeH mode: &crate::filesystem::vfs::file::FileMode, 280f678331aShanjiezhou ) -> Result<(), SystemError> { 281dfe53cf0SGnoCiYeH let mut guard = self.inner.lock(); 282876cb89eSGnoCiYeH // 不能以读写方式打开管道 283876cb89eSGnoCiYeH if mode.contains(FileMode::O_RDWR) { 284876cb89eSGnoCiYeH return Err(SystemError::EACCES); 285876cb89eSGnoCiYeH } 286876cb89eSGnoCiYeH if mode.contains(FileMode::O_RDONLY) { 287876cb89eSGnoCiYeH guard.reader += 1; 288876cb89eSGnoCiYeH } 289876cb89eSGnoCiYeH if mode.contains(FileMode::O_WRONLY) { 290876cb89eSGnoCiYeH guard.writer += 1; 291876cb89eSGnoCiYeH } 292876cb89eSGnoCiYeH 293876cb89eSGnoCiYeH // 设置mode 294876cb89eSGnoCiYeH *data = FilePrivateData::Pipefs(PipeFsPrivateData { mode: *mode }); 295876cb89eSGnoCiYeH 296f678331aShanjiezhou return Ok(()); 297f678331aShanjiezhou } 298f678331aShanjiezhou metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError>299f678331aShanjiezhou fn metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError> { 300dfe53cf0SGnoCiYeH let inode = self.inner.lock(); 301f678331aShanjiezhou let mut metadata = inode.metadata.clone(); 302f678331aShanjiezhou metadata.size = inode.data.len() as i64; 303f678331aShanjiezhou 304f678331aShanjiezhou return Ok(metadata); 305f678331aShanjiezhou } 306f678331aShanjiezhou close(&self, data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError>307dfe53cf0SGnoCiYeH fn close(&self, data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> { 308876cb89eSGnoCiYeH let mode: FileMode; 309dfe53cf0SGnoCiYeH if let FilePrivateData::Pipefs(pipe_data) = &*data { 310876cb89eSGnoCiYeH mode = pipe_data.mode; 311876cb89eSGnoCiYeH } else { 312876cb89eSGnoCiYeH return Err(SystemError::EBADF); 313876cb89eSGnoCiYeH } 314dfe53cf0SGnoCiYeH let mut guard = self.inner.lock(); 315876cb89eSGnoCiYeH 316876cb89eSGnoCiYeH // 写端关闭 317876cb89eSGnoCiYeH if mode.contains(FileMode::O_WRONLY) { 318876cb89eSGnoCiYeH assert!(guard.writer > 0); 319876cb89eSGnoCiYeH guard.writer -= 1; 320876cb89eSGnoCiYeH // 如果已经没有写端了,则唤醒读端 321876cb89eSGnoCiYeH if guard.writer == 0 { 322dfe53cf0SGnoCiYeH self.read_wait_queue 323876cb89eSGnoCiYeH .wakeup_all(Some(ProcessState::Blocked(true))); 324876cb89eSGnoCiYeH } 325876cb89eSGnoCiYeH } 326876cb89eSGnoCiYeH 327876cb89eSGnoCiYeH // 读端关闭 328876cb89eSGnoCiYeH if mode.contains(FileMode::O_RDONLY) { 329876cb89eSGnoCiYeH assert!(guard.reader > 0); 330876cb89eSGnoCiYeH guard.reader -= 1; 331876cb89eSGnoCiYeH // 如果已经没有写端了,则唤醒读端 332876cb89eSGnoCiYeH if guard.reader == 0 { 333dfe53cf0SGnoCiYeH self.write_wait_queue 334876cb89eSGnoCiYeH .wakeup_all(Some(ProcessState::Blocked(true))); 335876cb89eSGnoCiYeH } 336876cb89eSGnoCiYeH } 337876cb89eSGnoCiYeH 338f678331aShanjiezhou return Ok(()); 339f678331aShanjiezhou } 340f678331aShanjiezhou write_at( &self, _offset: usize, len: usize, buf: &[u8], data: SpinLockGuard<FilePrivateData>, ) -> Result<usize, SystemError>341f678331aShanjiezhou fn write_at( 342f678331aShanjiezhou &self, 343f678331aShanjiezhou _offset: usize, 344f678331aShanjiezhou len: usize, 345f678331aShanjiezhou buf: &[u8], 346dfe53cf0SGnoCiYeH data: SpinLockGuard<FilePrivateData>, 34791e9d4abSLoGin ) -> Result<usize, SystemError> { 348876cb89eSGnoCiYeH // 获取mode 349876cb89eSGnoCiYeH let mode: FileMode; 350dfe53cf0SGnoCiYeH if let FilePrivateData::Pipefs(pdata) = &*data { 351876cb89eSGnoCiYeH mode = pdata.mode; 352876cb89eSGnoCiYeH } else { 353876cb89eSGnoCiYeH return Err(SystemError::EBADF); 354876cb89eSGnoCiYeH } 355876cb89eSGnoCiYeH 356f678331aShanjiezhou if buf.len() < len || len > PIPE_BUFF_SIZE { 357f678331aShanjiezhou return Err(SystemError::EINVAL); 358f678331aShanjiezhou } 359f678331aShanjiezhou // 加锁 360f678331aShanjiezhou 361dfe53cf0SGnoCiYeH let mut inode = self.inner.lock(); 362f678331aShanjiezhou 363b5b571e0SLoGin if inode.reader == 0 { 364876cb89eSGnoCiYeH // TODO: 如果已经没有读端存在了,则向写端进程发送SIGPIPE信号 365b5b571e0SLoGin } 366876cb89eSGnoCiYeH 367f678331aShanjiezhou // 如果管道空间不够 368f678331aShanjiezhou 369f678331aShanjiezhou while len + inode.valid_cnt as usize > PIPE_BUFF_SIZE { 370f678331aShanjiezhou // 唤醒读端 371dfe53cf0SGnoCiYeH self.read_wait_queue 3721496ba7bSLoGin .wakeup(Some(ProcessState::Blocked(true))); 3731496ba7bSLoGin 37422c9db31Shanjiezhou // 如果为非阻塞管道,直接返回错误 375876cb89eSGnoCiYeH if mode.contains(FileMode::O_NONBLOCK) { 37622c9db31Shanjiezhou drop(inode); 37722c9db31Shanjiezhou return Err(SystemError::ENOMEM); 37822c9db31Shanjiezhou } 3791496ba7bSLoGin 380f678331aShanjiezhou // 解锁并睡眠 381f678331aShanjiezhou drop(inode); 382*dc9b4feaSLoGin let r = wq_wait_event_interruptible!(self.write_wait_queue, self.writeable(), {}); 383*dc9b4feaSLoGin if r.is_err() { 384*dc9b4feaSLoGin return Err(SystemError::ERESTARTSYS); 385f678331aShanjiezhou } 386dfe53cf0SGnoCiYeH inode = self.inner.lock(); 387f678331aShanjiezhou } 388f678331aShanjiezhou 389f678331aShanjiezhou // 决定要输入的字节 390f678331aShanjiezhou let start = inode.write_pos as usize; 391f678331aShanjiezhou let end = (inode.write_pos as usize + len) % PIPE_BUFF_SIZE; 392f678331aShanjiezhou // 从用户的缓冲区拷贝数据到管道 393f678331aShanjiezhou 394f678331aShanjiezhou if end < start { 395f678331aShanjiezhou inode.data[start..PIPE_BUFF_SIZE].copy_from_slice(&buf[0..(PIPE_BUFF_SIZE - start)]); 396f678331aShanjiezhou inode.data[0..end].copy_from_slice(&buf[(PIPE_BUFF_SIZE - start)..len]); 397f678331aShanjiezhou } else { 398f678331aShanjiezhou inode.data[start..end].copy_from_slice(&buf[0..len]); 399f678331aShanjiezhou } 400f678331aShanjiezhou // 更新写位置以及valid_cnt 401f678331aShanjiezhou inode.write_pos = (inode.write_pos + len as i32) % PIPE_BUFF_SIZE as i32; 402f678331aShanjiezhou inode.valid_cnt += len as i32; 403f678331aShanjiezhou 4045e948c56SGnoCiYeH // 写完后还有位置,则唤醒下一个写者 4055e948c56SGnoCiYeH if (inode.valid_cnt as usize) < PIPE_BUFF_SIZE { 406dfe53cf0SGnoCiYeH self.write_wait_queue 4075e948c56SGnoCiYeH .wakeup(Some(ProcessState::Blocked(true))); 4085e948c56SGnoCiYeH } 4095e948c56SGnoCiYeH 410f678331aShanjiezhou // 读完后解锁并唤醒等待在读等待队列中的进程 411dfe53cf0SGnoCiYeH self.read_wait_queue 4121496ba7bSLoGin .wakeup(Some(ProcessState::Blocked(true))); 4135e948c56SGnoCiYeH 414dfe53cf0SGnoCiYeH let pollflag = EPollEventType::from_bits_truncate(inode.poll(&data)? as u32); 4155e948c56SGnoCiYeH // 唤醒epoll中等待的进程 416b5b571e0SLoGin EventPoll::wakeup_epoll(&inode.epitems, pollflag)?; 4175e948c56SGnoCiYeH 418f678331aShanjiezhou // 返回写入的字节数 419f678331aShanjiezhou return Ok(len); 420f678331aShanjiezhou } 421f678331aShanjiezhou as_any_ref(&self) -> &dyn core::any::Any422f678331aShanjiezhou fn as_any_ref(&self) -> &dyn core::any::Any { 423f678331aShanjiezhou self 424f678331aShanjiezhou } 425f678331aShanjiezhou get_entry_name_and_metadata( &self, ino: crate::filesystem::vfs::InodeId, ) -> Result<(alloc::string::String, crate::filesystem::vfs::Metadata), SystemError>426f678331aShanjiezhou fn get_entry_name_and_metadata( 427f678331aShanjiezhou &self, 428f678331aShanjiezhou ino: crate::filesystem::vfs::InodeId, 429f678331aShanjiezhou ) -> Result<(alloc::string::String, crate::filesystem::vfs::Metadata), SystemError> { 430f678331aShanjiezhou // 如果有条件,请在文件系统中使用高效的方式实现本接口,而不是依赖这个低效率的默认实现。 431f678331aShanjiezhou let name = self.get_entry_name(ino)?; 432f678331aShanjiezhou let entry = self.find(&name)?; 433f678331aShanjiezhou return Ok((name, entry.metadata()?)); 434f678331aShanjiezhou } 435f678331aShanjiezhou fs(&self) -> Arc<(dyn FileSystem)>436f678331aShanjiezhou fn fs(&self) -> Arc<(dyn FileSystem)> { 437f678331aShanjiezhou todo!() 438f678331aShanjiezhou } 439f678331aShanjiezhou list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError>440f678331aShanjiezhou fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> { 4411074eb34SSamuel Dai return Err(SystemError::ENOSYS); 442f678331aShanjiezhou } 4435e948c56SGnoCiYeH poll(&self, private_data: &FilePrivateData) -> Result<usize, SystemError>4445e948c56SGnoCiYeH fn poll(&self, private_data: &FilePrivateData) -> Result<usize, SystemError> { 445dfe53cf0SGnoCiYeH return self.inner.lock().poll(private_data); 4465e948c56SGnoCiYeH } 447f678331aShanjiezhou } 448