From ecd7615ea62263969493a10610fa72475614692e Mon Sep 17 00:00:00 2001
From: Max Burke <max@urbanlogiq.com>
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<R: Seek> Seek for BufReader<R> {
     fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
         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 <max@urbanlogiq.com>
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<R: Seek> Seek for BufReader<R> {
         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 <max@urbanlogiq.com>
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<R: Seek> Seek for BufReader<R> {
         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 <max@urbanlogiq.com>
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<R> {
     buf: Box<[u8]>,
     pos: usize,
     cap: usize,
+    inner_pos: u64,
 }
 
 impl<R: Read> BufReader<R> {
@@ -360,7 +361,7 @@ impl<R: Seek> Seek for BufReader<R> {
         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<R: Seek> Seek for BufReader<R> {
             result = self.inner.seek(pos)?;
         }
         self.discard_buffer();
+        self.inner_pos = result;
         Ok(result)
     }
 }