diff options
| author | gingerBill <bill@gingerbill.org> | 2021-08-18 20:46:10 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-08-18 20:46:10 +0100 |
| commit | 08942714a2588357318114a8df6ea3b1417fc611 (patch) | |
| tree | c6626a40bb6637506b9a177b8e457a692f19be2e /src/common.cpp | |
| parent | 3c443babb204feeb0c7a3ed8530a19c80846e71e (diff) | |
Make `Arena` allocate virtual memory directory; make it use a `BlockingMutex`
Diffstat (limited to 'src/common.cpp')
| -rw-r--r-- | src/common.cpp | 71 |
1 files changed, 26 insertions, 45 deletions
diff --git a/src/common.cpp b/src/common.cpp index 4d98fe08d..890d53ddc 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -462,15 +462,13 @@ gb_global bool global_module_path_set = false; #define ALIGN_UP_PTR(p, a) (cast(void *)ALIGN_UP(cast(uintptr)(p), (a))) typedef struct Arena { - u8 * ptr; - u8 * end; - u8 * prev; - Array<u8 *> blocks; - gbAllocator backing; - isize block_size; - gbMutex mutex; - isize total_used; - bool use_mutex; + u8 * ptr; + u8 * end; + u8 * prev; + Array<gbVirtualMemory> blocks; + BlockingMutex mutex; + std::atomic<isize> block_size; + std::atomic<isize> total_used; } Arena; #define ARENA_MIN_ALIGNMENT 16 @@ -479,44 +477,34 @@ typedef struct Arena { gb_global Arena permanent_arena = {}; -void arena_init(Arena *arena, gbAllocator backing, isize block_size=ARENA_DEFAULT_BLOCK_SIZE) { - arena->backing = backing; +void arena_init(Arena *arena, gbAllocator block_allocator, isize block_size=ARENA_DEFAULT_BLOCK_SIZE) { + mutex_init(&arena->mutex); arena->block_size = block_size; - arena->use_mutex = true; - array_init(&arena->blocks, backing, 0, 2); - gb_mutex_init(&arena->mutex); + array_init(&arena->blocks, block_allocator, 0, 2); } -void arena_grow(Arena *arena, isize min_size) { - if (arena->use_mutex) { - gb_mutex_lock(&arena->mutex); - } - - isize size = gb_max(arena->block_size, min_size); +void arena_internal_grow(Arena *arena, isize min_size) { + isize size = gb_max(arena->block_size.load(), min_size); size = ALIGN_UP(size, ARENA_MIN_ALIGNMENT); - void *new_ptr = gb_alloc(arena->backing, size); - arena->ptr = cast(u8 *)new_ptr; - // zero_size(arena->ptr, size); // NOTE(bill): This should already be zeroed - GB_ASSERT(arena->ptr == ALIGN_DOWN_PTR(arena->ptr, ARENA_MIN_ALIGNMENT)); - arena->end = arena->ptr + size; - array_add(&arena->blocks, arena->ptr); - if (arena->use_mutex) { - gb_mutex_unlock(&arena->mutex); - } + gbVirtualMemory vmem = gb_vm_alloc(nullptr, size); + GB_ASSERT(vmem.data != nullptr); + GB_ASSERT(vmem.size >= size); + arena->ptr = cast(u8 *)vmem.data; + GB_ASSERT(arena->ptr == ALIGN_DOWN_PTR(arena->ptr, ARENA_MIN_ALIGNMENT)); + arena->end = arena->ptr + vmem.size; + array_add(&arena->blocks, vmem); } void *arena_alloc(Arena *arena, isize size, isize alignment) { - if (arena->use_mutex) { - gb_mutex_lock(&arena->mutex); - } + mutex_lock(&arena->mutex); - arena->total_used += size; if (size > (arena->end - arena->ptr)) { - arena_grow(arena, size); + arena_internal_grow(arena, size); GB_ASSERT(size <= (arena->end - arena->ptr)); } + arena->total_used += size; isize align = gb_max(alignment, ARENA_MIN_ALIGNMENT); void *ptr = arena->ptr; @@ -524,29 +512,22 @@ void *arena_alloc(Arena *arena, isize size, isize alignment) { arena->ptr = cast(u8 *)ALIGN_UP_PTR(arena->ptr + size, align); GB_ASSERT(arena->ptr <= arena->end); GB_ASSERT(ptr == ALIGN_DOWN_PTR(ptr, align)); - // zero_size(ptr, size); - if (arena->use_mutex) { - gb_mutex_unlock(&arena->mutex); - } + mutex_unlock(&arena->mutex); return ptr; } void arena_free_all(Arena *arena) { - if (arena->use_mutex) { - gb_mutex_lock(&arena->mutex); - } + mutex_lock(&arena->mutex); for_array(i, arena->blocks) { - gb_free(arena->backing, arena->blocks[i]); + gb_vm_free(arena->blocks[i]); } array_clear(&arena->blocks); arena->ptr = nullptr; arena->end = nullptr; - if (arena->use_mutex) { - gb_mutex_unlock(&arena->mutex); - } + mutex_unlock(&arena->mutex); } |