* renamed to BlockAllocator * now it's template with compile time assingable block_size and block_in_allocation variables -WIP Event management * probably working sendSelfEvent() * registerEvent() -added win_dll.d as Windows DLL require functionality
40 lines
1.1 KiB
D
40 lines
1.1 KiB
D
module ecs.block_allocator;
|
|
|
|
import ecs.manager;
|
|
|
|
import std.experimental.allocator;
|
|
import std.experimental.allocator.mallocator : AlignedMallocator, Mallocator;
|
|
|
|
struct BlockAllocator(uint block_size, uint blocks_in_allocation)
|
|
{
|
|
void* next_block;
|
|
|
|
void* getBlock()
|
|
{
|
|
if (next_block is null)
|
|
allocBlock();
|
|
void* ret = next_block;
|
|
next_block = *cast(void**) next_block;
|
|
return ret;
|
|
}
|
|
|
|
void freeBlock(void* block)
|
|
{
|
|
*cast(void**)block = next_block;
|
|
next_block = block;
|
|
}
|
|
|
|
private void allocBlock()
|
|
{
|
|
next_block = cast(void*) AlignedMallocator.instance.alignedAllocate(
|
|
block_size * blocks_in_allocation, block_size);
|
|
foreach (i; 0 .. blocks_in_allocation - 1)
|
|
{
|
|
void** pointer = cast(void**)(next_block + i * block_size);
|
|
*pointer = next_block + (i + 1) * block_size;
|
|
}
|
|
void** pointer = cast(void**)(
|
|
next_block + (blocks_in_allocation - 1) * block_size);
|
|
*pointer = null;
|
|
}
|
|
}
|