From ecd7615ea62263969493a10610fa72475614692e Mon Sep 17 00:00:00 2001 From: Max Burke Date: Mon, 30 Mar 2020 10:49:15 -0700 Subject: [PATCH 1/4] Seeking from Current(0) return current stream position. The stream_position convenience function is implemented with seek(SeekFrom::Current(0)) and when used with a BufReader this causes the internal buffer to be dumped every time the stream position is queried, which negates many of the benefits when using BufReader with high latency data streams. --- src/libstd/io/buffered.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 8862226adbbd3..5f14dbf4ff188 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -359,6 +359,10 @@ impl Seek for BufReader { fn seek(&mut self, pos: SeekFrom) -> io::Result { let result: u64; if let SeekFrom::Current(n) = pos { + if n == 0 { + return Ok(self.pos) + } + let remainder = (self.cap - self.pos) as i64; // it should be safe to assume that remainder fits within an i64 as the alternative // means we managed to allocate 8 exbibytes and that's absurd. From 9b844eb9d7e463a470720320b3e8e957f287237b Mon Sep 17 00:00:00 2001 From: Max Burke Date: Mon, 30 Mar 2020 10:58:05 -0700 Subject: [PATCH 2/4] Cast usize to u64 --- src/libstd/io/buffered.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 5f14dbf4ff188..072ca6b17cf5f 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -360,7 +360,7 @@ impl Seek for BufReader { let result: u64; if let SeekFrom::Current(n) = pos { if n == 0 { - return Ok(self.pos) + return Ok(self.pos as u64) } let remainder = (self.cap - self.pos) as i64; From 69ec723fa25cb81ffcd72a4875ab9aa0459960b7 Mon Sep 17 00:00:00 2001 From: Max Burke Date: Mon, 30 Mar 2020 11:11:33 -0700 Subject: [PATCH 3/4] rustfmt --- src/libstd/io/buffered.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 072ca6b17cf5f..c8dbf94ca6654 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -360,7 +360,7 @@ impl Seek for BufReader { let result: u64; if let SeekFrom::Current(n) = pos { if n == 0 { - return Ok(self.pos as u64) + return Ok(self.pos as u64); } let remainder = (self.cap - self.pos) as i64; From 91c56e54a47eef02bf42dbbfe161f40a204f8055 Mon Sep 17 00:00:00 2001 From: Max Burke Date: Mon, 30 Mar 2020 12:11:16 -0700 Subject: [PATCH 4/4] self.pos doesn't track the inner stream position --- src/libstd/io/buffered.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index c8dbf94ca6654..33102a687052b 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -56,6 +56,7 @@ pub struct BufReader { buf: Box<[u8]>, pos: usize, cap: usize, + inner_pos: u64, } impl BufReader { @@ -360,7 +361,7 @@ impl Seek for BufReader { let result: u64; if let SeekFrom::Current(n) = pos { if n == 0 { - return Ok(self.pos as u64); + return Ok(self.inner_pos); } let remainder = (self.cap - self.pos) as i64; @@ -382,6 +383,7 @@ impl Seek for BufReader { result = self.inner.seek(pos)?; } self.discard_buffer(); + self.inner_pos = result; Ok(result) } }