Skip to content

Commit

Permalink
Fix bugs in BytesMut::reserve_inner (#544)
Browse files Browse the repository at this point in the history
  • Loading branch information
NobodyXu authored Apr 28, 2022
1 parent 8198f9e commit 0a2c43a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/bytes_mut.rs
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,7 @@ impl BytesMut {
self.cap = v.capacity();
} else {
// calculate offset
let off = v.capacity() - self.cap;
let off = (self.ptr.as_ptr() as usize) - (v.as_ptr() as usize);

// new_cap is calculated in terms of `BytesMut`, not the underlying
// `Vec`, so it does not take the offset into account.
Expand Down
19 changes: 19 additions & 0 deletions tests/test_bytes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,25 @@ fn reserve_in_arc_nonunique_does_not_overallocate() {
assert_eq!(2001, bytes.capacity());
}

/// This function tests `BytesMut::reserve_inner`, where `BytesMut` holds
/// a unique reference to the shared vector and decide to reuse it
/// by reallocating the `Vec`.
#[test]
fn reserve_shared_reuse() {
let mut bytes = BytesMut::with_capacity(1000);
bytes.put_slice(b"Hello, World!");
drop(bytes.split());

bytes.put_slice(b"!123ex123,sadchELLO,_wORLD!");
// Use split_off so that v.capacity() - self.cap != off
drop(bytes.split_off(9));
assert_eq!(&*bytes, b"!123ex123");

bytes.reserve(2000);
assert_eq!(&*bytes, b"!123ex123");
assert_eq!(bytes.capacity(), 2009);
}

#[test]
fn extend_mut() {
let mut bytes = BytesMut::with_capacity(0);
Expand Down

0 comments on commit 0a2c43a

Please sign in to comment.