-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
It would be nice to have a simple bump allocator without extra tracking of freed blocks.
This would make generated machine code for common case shorter.
I imagine it would be like this:
#[repr(C)]
struct BumpStalloc<const L: usize, const B: usize> {
_align: Align<B>,
buffer: UnsafeCell<[MaybeUninit<[u8; B]>; L]>,
next_free_block: usize,
count_living_allocs: usize,
}
fn alloc(&self, layout: Layout)->Result<NonNull<[u8]>, AllocError>{
let blocks = /* calc blocks */
if self.next_free_block + blocks <= L {
let res_ptr = (buffer.get() as *mut u8).add(self.next_free_block * L)
self.next_free_block += blocks;
self.count_living_allocs += 1;
Ok(slice from res_ptr)
} else {
Err()
}
}
fn grow(&self, layout: Layout)->Result<NonNull<[u8]>, AllocError>{
if is_last() {
try_extend();
} else {
Err()
}
}
fn dealloc(&self, ptr, layout) {
if is_last() {
next_free_block -= length;
}
count_living_allocs -= 1;
if count_living_allocs == 0 {
// No living allocations, can safely reset.
// next_free_block may be not naturally 0 if allocs/deallocs didn't
// happen in stricly symmetrical fashion
next_free_block = 0;
}
}Metadata
Metadata
Assignees
Labels
No labels