Skip to content

Commit 0f38158

Browse files
committed
Updated comments; only pre-flush newline terminated buffers
1 parent 37570e8 commit 0f38158

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

src/libstd/io/buffered.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -896,8 +896,10 @@ impl<'a, W: Write> Write for LineWriterShim<'a, W> {
896896
// one line), just do a regular buffered write
897897
let newline_idx = match memchr::memrchr(b'\n', buf) {
898898
None => {
899-
// Check for prior partial line writes that need to be retried
900-
if memchr::memchr(b'\n', &self.inner.buffer()).is_some() {
899+
// Check for prior partial line writes that need to be retried.
900+
// Only retry if the buffer contains a completed line, to
901+
// avoid flushing partial lines.
902+
if let Some(b'\n') = self.inner.buffer().last().copied() {
901903
self.inner.flush_buf()?;
902904
}
903905
return self.inner.write(buf);
@@ -916,13 +918,13 @@ impl<'a, W: Write> Write for LineWriterShim<'a, W> {
916918
// `write` convention, make at most one attempt to add new (unbuffered)
917919
// data. Because this write doesn't touch the BufWriter state directly,
918920
// and the buffer is known to be empty, we don't need to worry about
919-
// self.panicked here.
921+
// self.inner.panicked here.
920922
let flushed = self.inner.get_mut().write(lines)?;
921923

922924
// Now that the write has succeeded, buffer the rest (or as much of
923925
// the rest as possible). If there were any unwritten newlines, we
924926
// only buffer out to the last unwritten newline; this helps prevent
925-
// flushing partial lines on subsequent calls to write_buffered_lines.
927+
// flushing partial lines on subsequent calls to LineWriterShim::write.
926928
let tail = &buf[flushed..];
927929
let buffered = match memchr::memrchr(b'\n', tail) {
928930
None => self.inner.write_to_buffer(tail),
@@ -970,8 +972,10 @@ impl<'a, W: Write> Write for LineWriterShim<'a, W> {
970972
let last_newline_buf_idx = match last_newline_buf_idx {
971973
// No newlines; just do a normal buffered write
972974
None => {
973-
// Check for prior partial line writes that need to be retried
974-
if memchr::memchr(b'\n', &self.inner.buffer()).is_some() {
975+
// Check for prior partial line writes that need to be retried.
976+
// Only retry if the buffer contains a completed line, to
977+
// avoid flushing partial lines.
978+
if let Some(b'\n') = self.inner.buffer().last().copied() {
975979
self.inner.flush_buf()?;
976980
}
977981
return self.inner.write_vectored(bufs);
@@ -1025,8 +1029,10 @@ impl<'a, W: Write> Write for LineWriterShim<'a, W> {
10251029
// one line), just do a regular buffered write
10261030
let newline_idx = match memchr::memrchr(b'\n', buf) {
10271031
None => {
1028-
// Check for prior partial line writes that need to be retried
1029-
if memchr::memchr(b'\n', &self.inner.buffer()).is_some() {
1032+
// Check for prior partial line writes that need to be retried.
1033+
// Only retry if the buffer contains a completed line, to
1034+
// avoid flushing partial lines.
1035+
if let Some(b'\n') = self.inner.buffer().last().copied() {
10301036
self.inner.flush_buf()?;
10311037
}
10321038
return self.inner.write_all(buf);

0 commit comments

Comments
 (0)