diff --git a/tokio/src/io/poll_evented.rs b/tokio/src/io/poll_evented.rs index 875ad7e0d0a..f5e8cffb8f3 100644 --- a/tokio/src/io/poll_evented.rs +++ b/tokio/src/io/poll_evented.rs @@ -165,8 +165,10 @@ feature! { match self.io.as_ref().unwrap().read(b) { Ok(n) => { // if we read a partially full buffer, this is sufficient on unix to show - // that the socket buffer has been drained - if n > 0 && (!cfg!(windows) && n < len) { + // that the socket buffer has been drained. Unfortunately this assumption + // fails for level-triggered selectors (like on Windows or poll even for + // UNIX): https://github.com/tokio-rs/tokio/issues/5866 + if n > 0 && (!cfg!(windows) && !cfg!(mio_unsupported_force_poll_poll) && n < len) { self.registration.clear_readiness(evt); } @@ -196,8 +198,10 @@ feature! { match self.io.as_ref().unwrap().write(buf) { Ok(n) => { // if we write only part of our buffer, this is sufficient on unix to show - // that the socket buffer is full - if n > 0 && (!cfg!(windows) && n < buf.len()) { + // that the socket buffer is full. Unfortunately this assumption + // fails for level-triggered selectors (like on Windows or poll even for + // UNIX): https://github.com/tokio-rs/tokio/issues/5866 + if n > 0 && (!cfg!(windows) && !cfg!(mio_unsupported_force_poll_poll) && n < buf.len()) { self.registration.clear_readiness(evt); }