mirror of
https://github.com/tokio-rs/tokio.git
synced 2025-10-01 12:20:39 +00:00
io: reduce syscalls in poll_write
(#4970)
This applies the same optimization made in #4840 to writes.
This commit is contained in:
parent
50795e652e
commit
c2612b446f
@ -188,7 +188,26 @@ feature! {
|
|||||||
&'a E: io::Write + 'a,
|
&'a E: io::Write + 'a,
|
||||||
{
|
{
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
self.registration.poll_write_io(cx, || self.io.as_ref().unwrap().write(buf))
|
|
||||||
|
loop {
|
||||||
|
let evt = ready!(self.registration.poll_write_ready(cx))?;
|
||||||
|
|
||||||
|
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()) {
|
||||||
|
self.registration.clear_readiness(evt);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Poll::Ready(Ok(n));
|
||||||
|
},
|
||||||
|
Err(e) if e.kind() == io::ErrorKind::WouldBlock => {
|
||||||
|
self.registration.clear_readiness(evt);
|
||||||
|
}
|
||||||
|
Err(e) => return Poll::Ready(Err(e)),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "net")]
|
#[cfg(feature = "net")]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user