diff options
| author | zy <[email protected]> | 2023-09-27 09:30:33 +0800 |
|---|---|---|
| committer | zy <[email protected]> | 2023-09-27 09:30:33 +0800 |
| commit | d2c95684637e68e750db69456cba228a4bc6da45 (patch) | |
| tree | 0486fc423c35cf640b6a067f0df14d54d2c47635 | |
| parent | a038a38a1f52d14a2af6f99c98c9a6cbc367d39e (diff) | |
更多注释
| -rw-r--r-- | monoio/src/driver/legacy/mod.rs | 10 | ||||
| -rw-r--r-- | monoio/src/driver/legacy/scheduled_io.rs | 18 | ||||
| -rw-r--r-- | monoio/src/driver/op.rs | 6 |
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. |
