-block allocator now track allocated blocks and is able to free memory

-jobs data is now allocated in System struct
-written memory cleanup (AddressSanitizer don't show any leak)
This commit is contained in:
Mergul 2019-06-18 16:45:38 +02:00
parent 9824b587fb
commit 235bbb49f2
7 changed files with 214 additions and 41 deletions

View file

@ -10,7 +10,15 @@ struct BlockAllocator//(uint block_size, uint blocks_in_allocation)
private uint block_size;
private uint blocks_in_allocation;
struct BlockPointers
{
void*[32] blocks;
uint numberof = 0;
BlockPointers* next_pointers = null;
}
void* next_block = null;
BlockPointers* pointers = null;
void* getBlock() nothrow @nogc
{
@ -31,6 +39,16 @@ struct BlockAllocator//(uint block_size, uint blocks_in_allocation)
{
next_block = cast(void*) AlignedMallocator.instance.alignedAllocate(
block_size * blocks_in_allocation, block_size);
if(pointers is null)pointers = Mallocator.instance.make!BlockPointers;
if(pointers.numberof >= 32)
{
BlockPointers* new_pointers = Mallocator.instance.make!BlockPointers;
new_pointers.next_pointers = pointers;
pointers = new_pointers;
}
pointers.blocks[pointers.numberof++] = next_block;
foreach (i; 0 .. blocks_in_allocation - 1)
{
void** pointer = cast(void**)(next_block + i * block_size);
@ -40,4 +58,18 @@ struct BlockAllocator//(uint block_size, uint blocks_in_allocation)
next_block + (blocks_in_allocation - 1) * block_size);
*pointer = null;
}
void freeMemory() nothrow @nogc
{
while(pointers)
{
foreach(i;0..pointers.numberof)
{
AlignedMallocator.instance.dispose(pointers.blocks[i]);
}
BlockPointers* next_pointers = pointers.next_pointers;
Mallocator.instance.dispose(pointers);
pointers = next_pointers;
}
}
}