| 64 | } |
| 65 | |
| 66 | void *PoolAllocator::allocate(u32 size, u32 align) |
| 67 | { |
| 68 | CE_ENSURE(size <= _block_size); |
| 69 | CE_ENSURE(align <= _block_align); |
| 70 | CE_ENSURE(is_power_of_2(align)); |
| 71 | CE_UNUSED_2(size, align); |
| 72 | |
| 73 | if (CE_UNLIKELY(_freelist == NULL)) { |
| 74 | PoolHeader *new_pool = make_pool(_backing, _num_blocks, _block_size, _block_align); |
| 75 | new_pool->next = _start; |
| 76 | _start = new_pool; |
| 77 | _freelist = new_pool->first_block; |
| 78 | } |
| 79 | |
| 80 | uintptr_t next_free = *(uintptr_t *)_freelist; |
| 81 | void *data = _freelist; |
| 82 | _freelist = (void *)next_free; |
| 83 | |
| 84 | return data; |
| 85 | } |
| 86 | |
| 87 | void PoolAllocator::deallocate(void *data) |
| 88 | { |