diff options
-rw-r--r-- | src/bytes_mut.rs | 5 | ||||
-rw-r--r-- | tests/test_bytes.rs | 16 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 4bfe0ff..e3fa48f 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -559,9 +559,8 @@ impl BytesMut { unsafe { let (off, prev) = self.get_vec_pos(); - // Only reuse space if we stand to gain at least capacity/2 - // bytes of space back - if off >= additional && off >= (self.cap / 2) { + // Only reuse space if we can satisfy the requested additional space. + if self.capacity() - self.len() + off >= additional { // There's space - reuse it // // Just move the pointer back to the start after copying diff --git a/tests/test_bytes.rs b/tests/test_bytes.rs index 106fa6f..bbe51f5 100644 --- a/tests/test_bytes.rs +++ b/tests/test_bytes.rs @@ -930,6 +930,22 @@ fn bytes_buf_mut_advance() { } #[test] +fn bytes_buf_mut_reuse_when_fully_consumed() { + use bytes::{Buf, BytesMut}; + let mut buf = BytesMut::new(); + buf.reserve(8192); + buf.extend_from_slice(&[0u8; 100][..]); + + let p = &buf[0] as *const u8; + buf.advance(100); + + buf.reserve(8192); + buf.extend_from_slice(b" "); + + assert_eq!(&buf[0] as *const u8, p); +} + +#[test] #[should_panic] fn bytes_reserve_overflow() { let mut bytes = BytesMut::with_capacity(1024); |