aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bytes_mut.rs5
-rw-r--r--tests/test_bytes.rs16
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);