Fix commit at block end
This commit is contained in:
+2
-1
@@ -25,7 +25,7 @@ MemoryBlock *memoryblock_allocate(size_t size, size_t commit_size)
|
|||||||
void arena_init(Arena *arena, const ArenaParams *params)
|
void arena_init(Arena *arena, const ArenaParams *params)
|
||||||
{
|
{
|
||||||
Assert(params->size > MemoryBlock_Header_Size);
|
Assert(params->size > MemoryBlock_Header_Size);
|
||||||
Assert(params->size < (U32_Max - Max(params->commit_size, platform_page_size()))); // Reserving last piece so our math doesn't overflow
|
Assert(params->size < (U32_Max - platform_page_size())); // Reserving last piece so our math doesn't overflow
|
||||||
Assert(IsPow2(params->commit_size));
|
Assert(IsPow2(params->commit_size));
|
||||||
|
|
||||||
MemoryBlock *block = memoryblock_allocate(params->size, params->commit_size);
|
MemoryBlock *block = memoryblock_allocate(params->size, params->commit_size);
|
||||||
@@ -84,6 +84,7 @@ void *arena_push(Arena *arena, U32 size, U32 align)
|
|||||||
// Commit more memory
|
// Commit more memory
|
||||||
U32 aligned_end_pos = AlignToPageEnd(start_pos + size);
|
U32 aligned_end_pos = AlignToPageEnd(start_pos + size);
|
||||||
U32 aligned_size = RoundUpToMultiple(aligned_end_pos - block->committed_pos, arena->commit_size);
|
U32 aligned_size = RoundUpToMultiple(aligned_end_pos - block->committed_pos, arena->commit_size);
|
||||||
|
aligned_size = Min(aligned_size, block->size - block->committed_pos); // Note(nos): Is this actually right ?
|
||||||
|
|
||||||
memory_commit(&block->base[block->committed_pos], aligned_size);
|
memory_commit(&block->base[block->committed_pos], aligned_size);
|
||||||
block->committed_pos += aligned_size;
|
block->committed_pos += aligned_size;
|
||||||
|
|||||||
+24
-1
@@ -44,6 +44,7 @@ static void arena_test_1(void)
|
|||||||
arena_dump(&arena);
|
arena_dump(&arena);
|
||||||
arena_free(&arena);
|
arena_free(&arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void arena_test_2(void)
|
static void arena_test_2(void)
|
||||||
{
|
{
|
||||||
ArenaParams arena_params = {};
|
ArenaParams arena_params = {};
|
||||||
@@ -92,8 +93,30 @@ static void arena_test_2(void)
|
|||||||
arena_free(&arena);
|
arena_free(&arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void arena_test_3(void)
|
||||||
|
{
|
||||||
|
ArenaParams arena_params = {};
|
||||||
|
U32 arena_size = KB(97) + MemoryBlock_Header_Size;
|
||||||
|
U32 commit_size = KB(32);
|
||||||
|
arena_params.size = arena_size;
|
||||||
|
arena_params.commit_size = commit_size;
|
||||||
|
Arena arena;
|
||||||
|
arena_init(&arena, &arena_params);
|
||||||
|
arena_dump(&arena);
|
||||||
|
void *ptr = arena_push(&arena, KB(64), 32);
|
||||||
|
MemoryZero(ptr, KB(64));
|
||||||
|
printf("Allocated ptr %p\n", ptr);
|
||||||
|
arena_dump(&arena);
|
||||||
|
ptr = arena_push(&arena, KB(97) - KB(64), 32);
|
||||||
|
MemoryZero(ptr, KB(97) - KB(64));
|
||||||
|
printf("Allocated ptr %p\n", ptr);
|
||||||
|
arena_dump(&arena);
|
||||||
|
arena_free(&arena);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
//arena_test_1();
|
//arena_test_1();
|
||||||
arena_test_2();
|
//arena_test_2();
|
||||||
|
arena_test_3();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user