xref: /DragonOS/kernel/src/ipc/pipe.rs (revision dc9b4fea1bcff86cfb49293552654e2dd038ae9e)
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