Struct linked_list_allocator::Heap
source · [−]pub struct Heap { /* private fields */ }
Expand description
A fixed size heap backed by a linked list of free memory blocks.
Implementations
sourceimpl Heap
impl Heap
pub const fn empty() -> Heap
sourcepub unsafe fn init(&mut self, heap_bottom: usize, heap_size: usize)
pub unsafe fn init(&mut self, heap_bottom: usize, heap_size: usize)
Initializes an empty heap
Unsafety
This function must be called at most once and must only be used on an empty heap.
sourcepub fn init_from_slice(&mut self, mem: &'static mut [MaybeUninit<u8>])
pub fn init_from_slice(&mut self, mem: &'static mut [MaybeUninit<u8>])
Initialize an empty heap with provided memory.
The caller is responsible for procuring a region of raw memory that may be utilized by the allocator. This might be done via any method such as (unsafely) taking a region from the program’s memory, from a mutable static, or by allocating and leaking such memory from another allocator.
The latter method may be especially useful if the underlying allocator does not perform deallocation (e.g. a simple bump allocator). Then the overlaid linked-list-allocator can provide memory reclamation.
Panics
This method panics if the heap is already initialized.
sourcepub unsafe fn new(heap_bottom: usize, heap_size: usize) -> Heap
pub unsafe fn new(heap_bottom: usize, heap_size: usize) -> Heap
Creates a new heap with the given bottom
and size
. The bottom address must be valid
and the memory in the [heap_bottom, heap_bottom + heap_size)
range must not be used for
anything else. This function is unsafe because it can cause undefined behavior if the
given address is invalid.
sourcepub fn from_slice(mem: &'static mut [MaybeUninit<u8>]) -> Heap
pub fn from_slice(mem: &'static mut [MaybeUninit<u8>]) -> Heap
Creates a new heap from a slice of raw memory.
This has the same effect as [init_from_slice
] on an empty heap, but it is combined into a
single operation that can not panic.
sourcepub fn allocate_first_fit(&mut self, layout: Layout) -> Result<NonNull<u8>, ()>
pub fn allocate_first_fit(&mut self, layout: Layout) -> Result<NonNull<u8>, ()>
Allocates a chunk of the given size with the given alignment. Returns a pointer to the
beginning of that chunk if it was successful. Else it returns None
.
This function scans the list of free memory blocks and uses the first block that is big
enough. The runtime is in O(n) where n is the number of free blocks, but it should be
reasonably fast for small allocations.
sourcepub unsafe fn deallocate(&mut self, ptr: NonNull<u8>, layout: Layout)
pub unsafe fn deallocate(&mut self, ptr: NonNull<u8>, layout: Layout)
Frees the given allocation. ptr
must be a pointer returned
by a call to the allocate_first_fit
function with identical size and alignment. Undefined
behavior may occur for invalid arguments, thus this function is unsafe.
This function walks the list of free memory blocks and inserts the freed block at the
correct place. If the freed block is adjacent to another free block, the blocks are merged
again. This operation is in O(n)
since the list needs to be sorted by address.
Auto Trait Implementations
impl RefUnwindSafe for Heap
impl Send for Heap
impl Sync for Heap
impl Unpin for Heap
impl !UnwindSafe for Heap
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstablefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more