mirror of
https://github.com/tokio-rs/bytes.git
synced 2026-08-25 00:00:22 +02:00
Release shared reference on zero truncate (#842)
Co-authored-by: JSap0914 <[email protected]>
This commit is contained in:
+3
-1
@@ -567,7 +567,9 @@ impl Bytes {
|
|||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn truncate(&mut self, len: usize) {
|
pub fn truncate(&mut self, len: usize) {
|
||||||
if len < self.len {
|
if len == 0 {
|
||||||
|
drop(mem::replace(self, Bytes::new_empty_with_ptr(self.ptr)));
|
||||||
|
} else if len < self.len {
|
||||||
// The Vec "promotable" vtables do not store the capacity,
|
// The Vec "promotable" vtables do not store the capacity,
|
||||||
// so we cannot truncate while using this repr. We *have* to
|
// so we cannot truncate while using this repr. We *have* to
|
||||||
// promote using `split_off` so the capacity can be stored.
|
// promote using `split_off` so the capacity can be stored.
|
||||||
|
|||||||
@@ -339,6 +339,31 @@ fn truncate() {
|
|||||||
assert_eq!(hello, "hello");
|
assert_eq!(hello, "hello");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn truncate_to_zero_releases_shared_reference() {
|
||||||
|
let mut bytes = BytesMut::from(&b"hello"[..]);
|
||||||
|
drop(bytes.split_off(bytes.len()));
|
||||||
|
let mut truncated = bytes.freeze();
|
||||||
|
let remaining = truncated.clone();
|
||||||
|
|
||||||
|
truncated.truncate(0);
|
||||||
|
|
||||||
|
assert!(truncated.is_empty());
|
||||||
|
let mut remaining = remaining.try_into_mut().unwrap();
|
||||||
|
remaining[0] = b'H';
|
||||||
|
assert_eq!(remaining, b"Hello"[..]);
|
||||||
|
|
||||||
|
let mut bytes = BytesMut::from(&b"hello"[..]);
|
||||||
|
drop(bytes.split_off(bytes.len()));
|
||||||
|
let mut nonempty = bytes.freeze();
|
||||||
|
let remaining = nonempty.clone();
|
||||||
|
|
||||||
|
nonempty.truncate(1);
|
||||||
|
|
||||||
|
assert_eq!(nonempty, b"h"[..]);
|
||||||
|
assert!(remaining.try_into_mut().is_err());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn freeze_clone_shared() {
|
fn freeze_clone_shared() {
|
||||||
let s = &b"abcdefgh"[..];
|
let s = &b"abcdefgh"[..];
|
||||||
|
|||||||
Reference in New Issue
Block a user