Skip to content

Commit

Permalink
BytesMut: Reuse buffer when data fully consumed via Buf
Browse files Browse the repository at this point in the history
  • Loading branch information
Bryan Donlan committed Jul 8, 2020
1 parent 90e7e65 commit e4751e2
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
5 changes: 2 additions & 3 deletions src/bytes_mut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 16 additions & 0 deletions tests/test_bytes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -929,6 +929,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() {
Expand Down

0 comments on commit e4751e2

Please sign in to comment.