split blocks

This commit is contained in:
Corwin Kuiper 2021-08-21 12:56:15 +01:00
parent 63d880f083
commit 3d269c98fd

View file

@ -54,14 +54,32 @@ unsafe impl GlobalAlloc for BlockAllocator {
// find a block that this current request fits in
let full_layout = Block::either_layout(layout);
let (block_after_layout, block_after_layout_offset) =
full_layout.extend(Layout::new::<Block>()).unwrap();
{
let mut state = self.state.lock();
let mut current_block = state.first_free_block;
let mut list_ptr = &mut state.first_free_block;
while let Some(mut curr) = current_block {
let curr_block = curr.as_mut();
if curr_block.size >= full_layout.size() {
if curr_block.size == full_layout.size() {
*list_ptr = curr_block.next;
return curr.as_ptr().cast();
} else if curr_block.size >= block_after_layout.size() {
// can split block
let split_block = Block {
size: curr_block.size - block_after_layout_offset,
next: curr_block.next,
};
let split_ptr = curr
.as_ptr()
.cast::<u8>()
.add(block_after_layout_offset)
.cast();
*split_ptr = split_block;
*list_ptr = NonNull::new(split_ptr);
return curr.as_ptr().cast();
}
current_block = curr_block.next;