pub struct SyncStalloc<const L: usize, const B: usize>(/* private fields */)
where
Align<B>: Alignment;Expand description
A wrapper around UnsafeStalloc that is safe to create because it prevents data races using a Mutex.
In comparison to UnsafeStalloc, the mutex may cause a slight overhead.
Implementations§
Source§impl<const L: usize, const B: usize> SyncStalloc<L, B>where
Align<B>: Alignment,
impl<const L: usize, const B: usize> SyncStalloc<L, B>where
Align<B>: Alignment,
Sourcepub const fn new() -> Self
pub const fn new() -> Self
Initializes a new empty SyncStalloc instance.
§Examples
use stalloc::SyncStalloc;
let alloc = SyncStalloc::<200, 8>::new();Sourcepub fn is_oom(&self) -> bool
pub fn is_oom(&self) -> bool
Checks if the allocator is completely out of memory.
If this is false, then you are guaranteed to be able to allocate
a layout with a size and alignment of B bytes.
This runs in O(1).
Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Checks if the allocator is empty.
If this is true, then you are guaranteed to be able to allocate
a layout with a size of B * L bytes and an alignment of B bytes.
If this is false, then this is guaranteed to be impossible.
This runs in O(1).
Sourcepub unsafe fn clear(&self)
pub unsafe fn clear(&self)
§Safety
Calling this function immediately invalidates all pointers into the allocator. Calling
deallocate_blocks() with an invalidated pointer will result in the free list being corrupted.
Sourcepub unsafe fn allocate_blocks(
&self,
size: usize,
align: usize,
) -> Result<NonNull<u8>, AllocError>
pub unsafe fn allocate_blocks( &self, size: usize, align: usize, ) -> Result<NonNull<u8>, AllocError>
Tries to allocate count blocks. If the allocation succeed, a pointer is returned. This function
never allocates more than necessary.
§Safety
size must be nonzero, and align must be a power of 2 in the range 1..=2^29 / B.
§Errors
Will return AllocError if the allocation was unsuccessful, in which case this function was a no-op.
Sourcepub unsafe fn deallocate_blocks(&self, ptr: NonNull<u8>, size: usize)
pub unsafe fn deallocate_blocks(&self, ptr: NonNull<u8>, size: usize)
Deallocates a pointer.
§Safety
ptr must point to an allocation, and size must be the number of blocks
in the allocation. That is, size is always in 1..=L.
Sourcepub unsafe fn shrink_in_place(
&self,
ptr: NonNull<u8>,
old_size: usize,
new_size: usize,
)
pub unsafe fn shrink_in_place( &self, ptr: NonNull<u8>, old_size: usize, new_size: usize, )
Shrinks the allocation. This function always succeeds and never reallocates.
§Safety
ptr must point to a valid allocation of old_size blocks, and new_size must be in 1..old_size.
Sourcepub unsafe fn grow_in_place(
&self,
ptr: NonNull<u8>,
old_size: usize,
new_size: usize,
) -> Result<(), AllocError>
pub unsafe fn grow_in_place( &self, ptr: NonNull<u8>, old_size: usize, new_size: usize, ) -> Result<(), AllocError>
Sourcepub unsafe fn grow_up_to(
&self,
ptr: NonNull<u8>,
old_size: usize,
new_size: usize,
) -> usize
pub unsafe fn grow_up_to( &self, ptr: NonNull<u8>, old_size: usize, new_size: usize, ) -> usize
Tries to grow the current allocation in-place. If that isn’t possible, the allocator grows by as much
as it is able to, and the new length of the allocation is returned. The new length is guaranteed to be
in the range old_size..=new_size.
§Safety
ptr must point to a valid allocation of old_size blocks. Also, new_size > old_size.
Sourcepub fn acquire_locked(&self) -> StallocGuard<'_, L, B>
pub fn acquire_locked(&self) -> StallocGuard<'_, L, B>
Acquires an exclusive lock for the allocator. This can be used to chain multiple operations on the allocator without having to repeatedly acquire locks for each one.
§Example
use stalloc::SyncStalloc;
let alloc = SyncStalloc::<100, 4>::new();
let lock = alloc.acquire_locked();
for _ in 0..20 {
// make multiple allocations in a row
unsafe { lock.allocate_blocks(5, 1) }.unwrap();
}
drop(lock); // until we drop the lock, all accesses to `alloc` will block
assert!(alloc.is_oom());Trait Implementations§
Source§impl<const L: usize, const B: usize> ChainableAlloc for SyncStalloc<L, B>where
Align<B>: Alignment,
impl<const L: usize, const B: usize> ChainableAlloc for SyncStalloc<L, B>where
Align<B>: Alignment,
Source§impl<const L: usize, const B: usize> GlobalAlloc for SyncStalloc<L, B>where
Align<B>: Alignment,
impl<const L: usize, const B: usize> GlobalAlloc for SyncStalloc<L, B>where
Align<B>: Alignment,
Source§unsafe fn alloc(&self, layout: Layout) -> *mut u8
unsafe fn alloc(&self, layout: Layout) -> *mut u8
layout. Read moreSource§unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8
unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8
alloc, but also ensures that the contents
are set to zero before being returned. Read more