|
@@ -1,6 +1,4 @@
|
|
use crate::{
|
|
use crate::{
|
|
- arch::CurrentIrqArch,
|
|
|
|
- exception::InterruptArch,
|
|
|
|
filesystem::vfs::{
|
|
filesystem::vfs::{
|
|
core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem,
|
|
core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem,
|
|
FileType, IndexNode, Metadata,
|
|
FileType, IndexNode, Metadata,
|
|
@@ -11,7 +9,7 @@ use crate::{
|
|
},
|
|
},
|
|
net::event_poll::{EPollEventType, EPollItem, EventPoll},
|
|
net::event_poll::{EPollEventType, EPollItem, EventPoll},
|
|
process::ProcessState,
|
|
process::ProcessState,
|
|
- sched::{schedule, SchedMode},
|
|
|
|
|
|
+ sched::SchedMode,
|
|
time::PosixTimeSpec,
|
|
time::PosixTimeSpec,
|
|
};
|
|
};
|
|
|
|
|
|
@@ -106,6 +104,10 @@ impl InnerPipeInode {
|
|
Ok(())
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ fn buf_full(&self) -> bool {
|
|
|
|
+ return self.valid_cnt as usize == PIPE_BUFF_SIZE;
|
|
|
|
+ }
|
|
|
|
+
|
|
pub fn remove_epoll(&self, epoll: &Weak<SpinLock<EventPoll>>) -> Result<(), SystemError> {
|
|
pub fn remove_epoll(&self, epoll: &Weak<SpinLock<EventPoll>>) -> Result<(), SystemError> {
|
|
let is_remove = !self
|
|
let is_remove = !self
|
|
.epitems
|
|
.epitems
|
|
@@ -166,6 +168,16 @@ impl LockedPipeInode {
|
|
pub fn inner(&self) -> &SpinLock<InnerPipeInode> {
|
|
pub fn inner(&self) -> &SpinLock<InnerPipeInode> {
|
|
&self.inner
|
|
&self.inner
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ fn readable(&self) -> bool {
|
|
|
|
+ let inode = self.inner.lock();
|
|
|
|
+ return inode.valid_cnt > 0 || inode.writer == 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fn writeable(&self) -> bool {
|
|
|
|
+ let inode = self.inner.lock();
|
|
|
|
+ return !inode.buf_full() || inode.reader == 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
impl IndexNode for LockedPipeInode {
|
|
impl IndexNode for LockedPipeInode {
|
|
@@ -189,6 +201,7 @@ impl IndexNode for LockedPipeInode {
|
|
if buf.len() < len {
|
|
if buf.len() < len {
|
|
return Err(SystemError::EINVAL);
|
|
return Err(SystemError::EINVAL);
|
|
}
|
|
}
|
|
|
|
+ // log::debug!("pipe mode: {:?}", mode);
|
|
// 加锁
|
|
// 加锁
|
|
let mut inode = self.inner.lock();
|
|
let mut inode = self.inner.lock();
|
|
|
|
|
|
@@ -209,14 +222,12 @@ impl IndexNode for LockedPipeInode {
|
|
}
|
|
}
|
|
|
|
|
|
// 否则在读等待队列中睡眠,并释放锁
|
|
// 否则在读等待队列中睡眠,并释放锁
|
|
- unsafe {
|
|
|
|
- let irq_guard = CurrentIrqArch::save_and_disable_irq();
|
|
|
|
-
|
|
|
|
- drop(inode);
|
|
|
|
- self.read_wait_queue.sleep_without_schedule();
|
|
|
|
- drop(irq_guard);
|
|
|
|
|
|
+ drop(inode);
|
|
|
|
+ let r = wq_wait_event_interruptible!(self.read_wait_queue, self.readable(), {});
|
|
|
|
+ if r.is_err() {
|
|
|
|
+ return Err(SystemError::ERESTARTSYS);
|
|
}
|
|
}
|
|
- schedule(SchedMode::SM_NONE);
|
|
|
|
|
|
+
|
|
inode = self.inner.lock();
|
|
inode = self.inner.lock();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -367,13 +378,11 @@ impl IndexNode for LockedPipeInode {
|
|
}
|
|
}
|
|
|
|
|
|
// 解锁并睡眠
|
|
// 解锁并睡眠
|
|
- unsafe {
|
|
|
|
- let irq_guard = CurrentIrqArch::save_and_disable_irq();
|
|
|
|
- drop(inode);
|
|
|
|
- self.write_wait_queue.sleep_without_schedule();
|
|
|
|
- drop(irq_guard);
|
|
|
|
|
|
+ drop(inode);
|
|
|
|
+ let r = wq_wait_event_interruptible!(self.write_wait_queue, self.writeable(), {});
|
|
|
|
+ if r.is_err() {
|
|
|
|
+ return Err(SystemError::ERESTARTSYS);
|
|
}
|
|
}
|
|
- schedule(SchedMode::SM_NONE);
|
|
|
|
inode = self.inner.lock();
|
|
inode = self.inner.lock();
|
|
}
|
|
}
|
|
|
|
|