Skip to content

Commit 14d2634

Browse files
authored
Add readiness checks (#524)
1 parent 81eaf88 commit 14d2634

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

Cargo.toml

-3
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ ntex-util = { path = "ntex-util" }
4545
ntex-compio = { path = "ntex-compio" }
4646
ntex-tokio = { path = "ntex-tokio" }
4747

48-
#ntex-neon = { git = "https://github.com/ntex-rs/neon.git" }
49-
#ntex-neon = { path = "../dev/neon" }
50-
5148
[workspace.dependencies]
5249
async-task = "4.5.0"
5350
bitflags = "2"

ntex-io/src/tasks.rs

+47-1
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,27 @@ impl IoContext {
723723

724724
/// Get read buffer
725725
pub fn with_read_buf<F>(&self, f: F) -> Poll<()>
726+
where
727+
F: FnOnce(&mut BytesVec) -> Poll<io::Result<usize>>,
728+
{
729+
let result = self.with_read_buf_inner(f);
730+
731+
// check read readiness
732+
if result.is_pending() {
733+
if let Some(waker) = self.0 .0.read_task.take() {
734+
let mut cx = Context::from_waker(&waker);
735+
736+
if let Poll::Ready(ReadStatus::Ready) =
737+
self.0.filter().poll_read_ready(&mut cx)
738+
{
739+
return Poll::Pending;
740+
}
741+
}
742+
}
743+
result
744+
}
745+
746+
fn with_read_buf_inner<F>(&self, f: F) -> Poll<()>
726747
where
727748
F: FnOnce(&mut BytesVec) -> Poll<io::Result<usize>>,
728749
{
@@ -817,8 +838,33 @@ impl IoContext {
817838
}
818839
}
819840

820-
/// Get write buffer
821841
pub fn with_write_buf<F>(&self, f: F) -> Poll<()>
842+
where
843+
F: FnOnce(&BytesVec) -> Poll<io::Result<usize>>,
844+
{
845+
let result = self.with_write_buf_inner(f);
846+
847+
// check write readiness
848+
if result.is_pending() {
849+
let inner = &self.0 .0;
850+
if let Some(waker) = inner.write_task.take() {
851+
let ready = self
852+
.0
853+
.filter()
854+
.poll_write_ready(&mut Context::from_waker(&waker));
855+
if !matches!(
856+
ready,
857+
Poll::Ready(WriteStatus::Ready | WriteStatus::Shutdown)
858+
) {
859+
return Poll::Ready(());
860+
}
861+
}
862+
}
863+
result
864+
}
865+
866+
/// Get write buffer
867+
fn with_write_buf_inner<F>(&self, f: F) -> Poll<()>
822868
where
823869
F: FnOnce(&BytesVec) -> Poll<io::Result<usize>>,
824870
{

0 commit comments

Comments
 (0)