增加epoll机制 (#455)

* ## 增加epoll机制
- 增加epoll机制
- 添加事件等待队列,提升socket性能
- 优化poll,删除不能poll的文件系统中的poll方法

* 添加细节注释

* 修复文件关闭后epoll还持有对应描述符的文件弱引用的bug

* 将EPollEvent设计为POSIX标准

* 修改s到us转换的计算错误
This commit is contained in:
GnoCiYeH
2023-12-25 18:08:12 +08:00
committed by GitHub
parent 070e991008
commit 406099704e
27 changed files with 1667 additions and 228 deletions

View File

@ -4,7 +4,7 @@ use crate::filesystem::vfs::file::FileMode;
use crate::filesystem::vfs::syscall::ModeType;
use crate::filesystem::vfs::{
core::generate_inode_id, make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode,
Metadata, PollStatus,
Metadata,
};
use crate::syscall::SystemError;
use crate::{libs::spinlock::SpinLock, time::TimeSpec};
@ -108,10 +108,6 @@ impl IndexNode for LockedAhciInode {
return Ok(());
}
fn poll(&self) -> Result<PollStatus, SystemError> {
return Ok(PollStatus::READ | PollStatus::WRITE);
}
/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
fn read_at(
&self,

View File

@ -8,7 +8,7 @@ use crate::{
devfs::{devfs_register, DevFS, DeviceINode},
vfs::{
core::generate_inode_id, file::FileMode, syscall::ModeType, FileType, IndexNode,
Metadata, PollStatus,
Metadata,
},
},
include::bindings::bindings::vfs_file_operations_t,
@ -152,10 +152,6 @@ impl IndexNode for LockedPS2KeyBoardInode {
return Ok(());
}
fn poll(&self) -> Result<PollStatus, SystemError> {
return Ok(PollStatus::READ);
}
fn metadata(&self) -> Result<Metadata, SystemError> {
return Ok(self.0.read().metadata.clone());
}

View File

@ -165,7 +165,7 @@ impl<T: Transport> phy::Device for VirtioNICDriver<T> {
fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
// kdebug!("VirtioNet: transmit");
if self.inner.lock().can_send() {
if self.inner.lock_irqsave().can_send() {
// kdebug!("VirtioNet: can send");
return Some(VirtioNetToken::new(self.clone(), None));
} else {

View File

@ -214,10 +214,6 @@ impl IndexNode for TtyDevice {
return Err(SystemError::EIO);
}
fn poll(&self) -> Result<crate::filesystem::vfs::PollStatus, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}
fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> {
return self.fs.read().upgrade().unwrap();
}