-
Notifications
You must be signed in to change notification settings - Fork 314
Description
Currently, Bytes
uses its own internal implementation for memory management. It supports a few strategies:
Vec<u8>
Arc<Vec<u8>>
- &'static [u8]
- an inlined strategy.
However, using a fixed strategy prohibits alternate strategies that would be more appropriate to the use case in question. One example is initializing a Bytes
instance backed by a file using mmap
.
Proposal
The Bytes
struct would be updated to:
struct Bytes {
raw: RawBytes,
}
struct RawBytes {
ptr: *const u8,
len: usize,
data: NonNull<()>,
vtable: &'static Vtable,
}
struct Vtable {
clone: unsafe fn(ptr: *const u8, len: usize, data: NonNull<()>) -> Bytes;
drop: unsafe fn(data: NonNull<()>);
}
An additional Bytes::from_raw
constructor would be added. The rest of the Bytes
API can be implemented using the above APIs.
Provided strategies
By default, the bytes
crate should provide some strategies for using Bytes
. A default of Arc<Vec<u8>>
seems sufficient. Feature flags can be used to opt-out of the default implementation.
BytesMut
The BytesMut
structure is no longer a core part of the bytes
API. It is unclear if it should stay in the bytes
crate as an option or move out to a separate crate.
Inline representation
This proposal would remove the ability to initialize a Bytes
instance using the "inline" representation. It is unclear how big of an impact this would have. It is also unclear if use cases that take advantage of "inline" representation would be able to use an alternate strategy enabled with this change.
Refs #269