summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzy <[email protected]>2023-09-27 09:30:33 +0800
committerzy <[email protected]>2023-09-27 09:30:33 +0800
commitd2c95684637e68e750db69456cba228a4bc6da45 (patch)
tree0486fc423c35cf640b6a067f0df14d54d2c47635
parenta038a38a1f52d14a2af6f99c98c9a6cbc367d39e (diff)
更多注释
-rw-r--r--monoio/src/driver/legacy/mod.rs10
-rw-r--r--monoio/src/driver/legacy/scheduled_io.rs18
-rw-r--r--monoio/src/driver/op.rs6
3 files changed, 23 insertions, 11 deletions
diff --git a/monoio/src/driver/legacy/mod.rs b/monoio/src/driver/legacy/mod.rs
index 483cd70..350a754 100644
--- a/monoio/src/driver/legacy/mod.rs
+++ b/monoio/src/driver/legacy/mod.rs
@@ -279,6 +279,7 @@ impl LegacyInner {
// wait io ready and do syscall
// 等待 io 准备就绪并执行系统调用
+ // index 是 io 的 唯一标识吗...
let mut scheduled_io = inner.io_dispatch.get(index).expect("scheduled_io lost");
let ref_mut = scheduled_io.as_mut();
loop {
@@ -295,18 +296,21 @@ impl LegacyInner {
flags: 0,
});
}
-
+ // system call
match OpAble::legacy_call(data) {
+ // io 读取结果成功
Ok(n) => {
return Poll::Ready(CompletionMeta {
result: Ok(n),
flags: 0,
})
}
+ // io 未就绪
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
- ref_mut.clear_readiness(direction.mask());
- continue;
+ ref_mut.clear_readiness(direction.mask()); // 清理就绪状态
+ continue; // 跳过此轮循环
}
+ // 出错
Err(e) => {
return Poll::Ready(CompletionMeta {
result: Err(e),
diff --git a/monoio/src/driver/legacy/scheduled_io.rs b/monoio/src/driver/legacy/scheduled_io.rs
index 41d901f..5ace84f 100644
--- a/monoio/src/driver/legacy/scheduled_io.rs
+++ b/monoio/src/driver/legacy/scheduled_io.rs
@@ -7,8 +7,10 @@ pub(crate) struct ScheduledIo {
readiness: Ready, // IO 的状态
/// Waker used for AsyncRead.
+ /// 读取的 waker
reader: Option<Waker>,
/// Waker used for AsyncWrite.
+ /// 写入的 waker
writer: Option<Waker>,
}
@@ -23,15 +25,16 @@ impl Default for ScheduledIo {
}
impl ScheduledIo {
+ // 设置可写
#[allow(unused)]
pub(crate) fn set_writable(&mut self) {
self.readiness |= Ready::WRITABLE;
}
-
+ // 设置可读
pub(crate) fn set_readiness(&mut self, f: impl Fn(Ready) -> Ready) {
self.readiness = f(self.readiness);
}
-
+ // 唤醒
pub(crate) fn wake(&mut self, ready: Ready) {
if ready.is_readable() {
if let Some(waker) = self.reader.take() {
@@ -44,7 +47,7 @@ impl ScheduledIo {
}
}
}
-
+ // 清理状态
pub(crate) fn clear_readiness(&mut self, ready: Ready) {
self.readiness = self.readiness - ready;
}
@@ -53,26 +56,31 @@ impl ScheduledIo {
pub(crate) fn poll_readiness(
&mut self,
cx: &mut Context<'_>,
- direction: Direction,
+ direction: Direction, // read or write
) -> Poll<Ready> {
let ready = direction.mask() & self.readiness;
+ // 如果已经准备好了,直接返回
if !ready.is_empty() {
return Poll::Ready(ready);
}
+ // 根据 direction 取 waker
let slot = match direction {
Direction::Read => &mut self.reader,
Direction::Write => &mut self.writer,
};
match slot {
+ // waker 存在
Some(existing) => {
+ // 如果 slot 的 waker 和 cx.waker 唤醒的不是同一个 task,更新 waker
if !existing.will_wake(cx.waker()) {
*existing = cx.waker().clone();
}
}
None => {
+ // waker 不存在,设置 waker
*slot = Some(cx.waker().clone());
}
}
- Poll::Pending
+ Poll::Pending // 返回 Pending
}
}
diff --git a/monoio/src/driver/op.rs b/monoio/src/driver/op.rs
index 979f35a..60ef587 100644
--- a/monoio/src/driver/op.rs
+++ b/monoio/src/driver/op.rs
@@ -40,7 +40,7 @@ pub(crate) struct Op<T: 'static> {
#[derive(Debug)]
pub(crate) struct Completion<T> {
pub(crate) data: T, // 返回的数据
- pub(crate) meta: CompletionMeta, // 操作状态?
+ pub(crate) meta: CompletionMeta, // 操作状态
}
/// Operation completion meta info.
@@ -57,9 +57,9 @@ pub(crate) trait OpAble {
fn uring_op(&mut self) -> io_uring::squeue::Entry;
#[cfg(feature = "legacy")]
- fn legacy_interest(&self) -> Option<(super::legacy::ready::Direction, usize)>;
+ fn legacy_interest(&self) -> Option<(super::legacy::ready::Direction, usize)>; // 获取 io 事件
#[cfg(feature = "legacy")]
- fn legacy_call(&mut self) -> io::Result<u32>;
+ fn legacy_call(&mut self) -> io::Result<u32>; // system call
}
/// If legacy is enabled and iouring is not, we can expose io interface in a poll-like way.