From 7a792f5cb016efa4c9d0f75a5b0c4e4ba7486332 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 20 Jan 2020 14:07:02 +0100 Subject: [PATCH] Implement GlobalAlloc::alloc --- src/allocator/fixed_size_block.rs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/allocator/fixed_size_block.rs b/src/allocator/fixed_size_block.rs index 7e8acaf3..c01573af 100644 --- a/src/allocator/fixed_size_block.rs +++ b/src/allocator/fixed_size_block.rs @@ -54,7 +54,26 @@ impl FixedSizeBlockAllocator { unsafe impl GlobalAlloc for Locked { unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - todo!(); + let mut allocator = self.lock(); + match list_index(&layout) { + Some(index) => { + match allocator.list_heads[index].take() { + Some(node) => { + allocator.list_heads[index] = node.next.take(); + node as *mut ListNode as *mut u8 + } + None => { + // no block exists in list => allocate new block + let block_size = BLOCK_SIZES[index]; + // only works if all block sizes are a power of 2 + let block_align = block_size; + let layout = Layout::from_size_align(block_size, block_align).unwrap(); + allocator.fallback_alloc(layout) + } + } + } + None => allocator.fallback_alloc(layout), + } } unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) {