Struct blink_alloc::BlinkAlloc
source · pub struct BlinkAlloc<A: Allocator = Global> { /* private fields */ }Expand description
Single-threaded blink allocator.
Blink-allocator is arena-based allocator that allocates memory in growing chunks and serve allocations from them. When chunk is exhausted a new larger chunk is allocated.
Deallocation is no-op. BlinkAlloc can be reset
to free all chunks except the last one, that will be reused.
Blink allocator aims to allocate a chunk large enough to serve all allocations between resets.
A shared and mutable reference to the BlinkAlloc implement
Allocator trait.
When “nightly” feature is enabled, Allocator trait is
core::alloc::Allocator. Otherwise it is duplicated trait defined
in allocator-api2.
Resetting blink allocator requires mutable borrow, so it is not possible
to do while shared borrow is alive. That matches requirement of
Allocator trait - while Allocator instance
(a shared reference to BlinkAlloc) or any of its clones are alive,
allocated memory must be valid.
This version of blink-allocator is single-threaded. It is possible
to send to another thread, but cannot be shared.
Internally it uses Cell for interior mutability and requires
that state cannot be changed from another thread.
For multi-threaded version see SyncBlinkAlloc.
Requires "sync" feature.
Example
let mut blink = BlinkAlloc::new();
let layout = std::alloc::Layout::new::<[u32; 8]>();
let ptr = blink.allocate(layout).unwrap();
let ptr = NonNull::new(ptr.as_ptr() as *mut u8).unwrap(); // Method for this is unstable.
unsafe {
std::ptr::write(ptr.as_ptr().cast(), [1, 2, 3, 4, 5, 6, 7, 8]);
}
blink.reset();Example that uses nightly’s allocator_api
let mut blink = BlinkAlloc::new();
let mut vec = Vec::new_in(&blink);
vec.push(1);
vec.extend(1..3);
vec.extend(3..10);
drop(vec);
blink.reset();Implementations§
source§impl BlinkAlloc<Global>
impl BlinkAlloc<Global>
sourcepub const fn new() -> Self
pub const fn new() -> Self
Creates new blink allocator that uses global allocator to allocate memory chunks.
See BlinkAlloc::new_in for using custom allocator.
sourcepub const fn with_chunk_size(chunk_size: usize) -> Self
pub const fn with_chunk_size(chunk_size: usize) -> Self
Creates new blink allocator that uses global allocator to allocate memory chunks. With this method you can specify initial chunk size.
See BlinkAlloc::new_in for using custom allocator.
source§impl<A> BlinkAlloc<A>where
A: Allocator,
impl<A> BlinkAlloc<A>where A: Allocator,
sourcepub const fn new_in(allocator: A) -> Self
pub const fn new_in(allocator: A) -> Self
Creates new blink allocator that uses provided allocator to allocate memory chunks.
See BlinkAlloc::new for using global allocator.
sourcepub const fn inner(&self) -> &A
pub const fn inner(&self) -> &A
Returns reference to the underlying allocator used by this blink allocator.
sourcepub const fn with_chunk_size_in(chunk_size: usize, allocator: A) -> Self
pub const fn with_chunk_size_in(chunk_size: usize, allocator: A) -> Self
Creates new blink allocator that uses global allocator to allocate memory chunks. With this method you can specify initial chunk size.
See BlinkAlloc::new_in for using custom allocator.
sourcepub fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
pub fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
Allocates memory with specified layout from this allocator.
If needed it will allocate new chunk using underlying allocator.
If chunk allocation fails, it will return Err.
sourcepub fn allocate_zeroed(
&self,
layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
pub fn allocate_zeroed( &self, layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
Behaves like allocate, but also ensures that the returned memory is zero-initialized.
sourcepub unsafe fn resize(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
pub unsafe fn resize( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
Resizes memory allocation. Potentially happens in-place.
Safety
ptr must be a pointer previously returned by allocate.
old_size must be in range layout.size()..=slice.len()
where layout is the layout used in the call to allocate.
and slice is the slice pointer returned by allocate.
On success, the old pointer is invalidated and the new pointer is returned. On error old allocation is still valid.
sourcepub unsafe fn resize_zeroed(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
pub unsafe fn resize_zeroed( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
sourcepub unsafe fn deallocate(&self, ptr: NonNull<u8>, size: usize)
pub unsafe fn deallocate(&self, ptr: NonNull<u8>, size: usize)
Deallocates memory previously allocated from this allocator.
This call may not actually free memory.
All memory is guaranteed to be freed on reset call.
Safety
ptr must be a pointer previously returned by allocate.
size must be in range layout.size()..=slice.len()
where layout is the layout used in the call to allocate.
and slice is the slice pointer returned by allocate.
sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Resets this allocator, deallocating all chunks except the last one. Last chunk will be reused. With steady memory usage after few iterations one chunk should be sufficient for all allocations between resets.
sourcepub fn reset_final(&mut self)
pub fn reset_final(&mut self)
Resets this allocator, deallocating all chunks.
sourcepub unsafe fn reset_unchecked(&self)
pub unsafe fn reset_unchecked(&self)
Resets this allocator, deallocating all chunks except the last one. Last chunk will be reused. With steady memory usage after few iterations one chunk should be sufficient for all allocations between resets.
Safety
Blink-allocators guarantee that memory can be used while shared
borrow to the allocator is held, preventing safe fn reset call.
With this method it becomes caller responsibility to ensure that allocated memory won’t be used after reset.
sourcepub fn into_inner(self) -> A
pub fn into_inner(self) -> A
Unwrap this allocator, returning the underlying allocator. Leaks allocated chunks.
To deallocate all chunks call reset_final first.
Trait Implementations§
source§impl<A> Allocator for &mut BlinkAlloc<A>where
A: Allocator,
impl<A> Allocator for &mut BlinkAlloc<A>where A: Allocator,
source§fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
allocator_api)source§fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
allocator_api)allocate, but also ensures that the returned memory is zero-initialized. Read moresource§unsafe fn shrink(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn shrink( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
allocator_api)source§unsafe fn grow(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn grow( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
allocator_api)source§unsafe fn grow_zeroed(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn grow_zeroed( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
allocator_api)grow, but also ensures that the new contents are set to zero before being
returned. Read moresource§impl<A> Allocator for BlinkAlloc<A>where
A: Allocator,
impl<A> Allocator for BlinkAlloc<A>where A: Allocator,
source§fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
fn allocate(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
allocator_api)source§fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
fn allocate_zeroed(&self, layout: Layout) -> Result<NonNull<[u8]>, AllocError>
allocator_api)allocate, but also ensures that the returned memory is zero-initialized. Read moresource§unsafe fn shrink(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn shrink( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
allocator_api)source§unsafe fn grow(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn grow( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
allocator_api)source§unsafe fn grow_zeroed(
&self,
ptr: NonNull<u8>,
old_layout: Layout,
new_layout: Layout
) -> Result<NonNull<[u8]>, AllocError>
unsafe fn grow_zeroed( &self, ptr: NonNull<u8>, old_layout: Layout, new_layout: Layout ) -> Result<NonNull<[u8]>, AllocError>
allocator_api)grow, but also ensures that the new contents are set to zero before being
returned. Read more