mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-07 16:18:52 +00:00
Make Arena allocate virtual memory directory; make it use a BlockingMutex
This commit is contained in:
+26
-45
@@ -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)))
|
#define ALIGN_UP_PTR(p, a) (cast(void *)ALIGN_UP(cast(uintptr)(p), (a)))
|
||||||
|
|
||||||
typedef struct Arena {
|
typedef struct Arena {
|
||||||
u8 * ptr;
|
u8 * ptr;
|
||||||
u8 * end;
|
u8 * end;
|
||||||
u8 * prev;
|
u8 * prev;
|
||||||
Array<u8 *> blocks;
|
Array<gbVirtualMemory> blocks;
|
||||||
gbAllocator backing;
|
BlockingMutex mutex;
|
||||||
isize block_size;
|
std::atomic<isize> block_size;
|
||||||
gbMutex mutex;
|
std::atomic<isize> total_used;
|
||||||
isize total_used;
|
|
||||||
bool use_mutex;
|
|
||||||
} Arena;
|
} Arena;
|
||||||
|
|
||||||
#define ARENA_MIN_ALIGNMENT 16
|
#define ARENA_MIN_ALIGNMENT 16
|
||||||
@@ -479,44 +477,34 @@ typedef struct Arena {
|
|||||||
|
|
||||||
gb_global Arena permanent_arena = {};
|
gb_global Arena permanent_arena = {};
|
||||||
|
|
||||||
void arena_init(Arena *arena, gbAllocator backing, isize block_size=ARENA_DEFAULT_BLOCK_SIZE) {
|
void arena_init(Arena *arena, gbAllocator block_allocator, isize block_size=ARENA_DEFAULT_BLOCK_SIZE) {
|
||||||
arena->backing = backing;
|
mutex_init(&arena->mutex);
|
||||||
arena->block_size = block_size;
|
arena->block_size = block_size;
|
||||||
arena->use_mutex = true;
|
array_init(&arena->blocks, block_allocator, 0, 2);
|
||||||
array_init(&arena->blocks, backing, 0, 2);
|
|
||||||
gb_mutex_init(&arena->mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void arena_grow(Arena *arena, isize min_size) {
|
void arena_internal_grow(Arena *arena, isize min_size) {
|
||||||
if (arena->use_mutex) {
|
isize size = gb_max(arena->block_size.load(), min_size);
|
||||||
gb_mutex_lock(&arena->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
isize size = gb_max(arena->block_size, min_size);
|
|
||||||
size = ALIGN_UP(size, ARENA_MIN_ALIGNMENT);
|
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) {
|
gbVirtualMemory vmem = gb_vm_alloc(nullptr, size);
|
||||||
gb_mutex_unlock(&arena->mutex);
|
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) {
|
void *arena_alloc(Arena *arena, isize size, isize alignment) {
|
||||||
if (arena->use_mutex) {
|
mutex_lock(&arena->mutex);
|
||||||
gb_mutex_lock(&arena->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
arena->total_used += size;
|
|
||||||
|
|
||||||
if (size > (arena->end - arena->ptr)) {
|
if (size > (arena->end - arena->ptr)) {
|
||||||
arena_grow(arena, size);
|
arena_internal_grow(arena, size);
|
||||||
GB_ASSERT(size <= (arena->end - arena->ptr));
|
GB_ASSERT(size <= (arena->end - arena->ptr));
|
||||||
}
|
}
|
||||||
|
arena->total_used += size;
|
||||||
|
|
||||||
isize align = gb_max(alignment, ARENA_MIN_ALIGNMENT);
|
isize align = gb_max(alignment, ARENA_MIN_ALIGNMENT);
|
||||||
void *ptr = arena->ptr;
|
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);
|
arena->ptr = cast(u8 *)ALIGN_UP_PTR(arena->ptr + size, align);
|
||||||
GB_ASSERT(arena->ptr <= arena->end);
|
GB_ASSERT(arena->ptr <= arena->end);
|
||||||
GB_ASSERT(ptr == ALIGN_DOWN_PTR(ptr, align));
|
GB_ASSERT(ptr == ALIGN_DOWN_PTR(ptr, align));
|
||||||
// zero_size(ptr, size);
|
|
||||||
|
|
||||||
if (arena->use_mutex) {
|
mutex_unlock(&arena->mutex);
|
||||||
gb_mutex_unlock(&arena->mutex);
|
|
||||||
}
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void arena_free_all(Arena *arena) {
|
void arena_free_all(Arena *arena) {
|
||||||
if (arena->use_mutex) {
|
mutex_lock(&arena->mutex);
|
||||||
gb_mutex_lock(&arena->mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
for_array(i, arena->blocks) {
|
for_array(i, arena->blocks) {
|
||||||
gb_free(arena->backing, arena->blocks[i]);
|
gb_vm_free(arena->blocks[i]);
|
||||||
}
|
}
|
||||||
array_clear(&arena->blocks);
|
array_clear(&arena->blocks);
|
||||||
arena->ptr = nullptr;
|
arena->ptr = nullptr;
|
||||||
arena->end = nullptr;
|
arena->end = nullptr;
|
||||||
|
|
||||||
if (arena->use_mutex) {
|
mutex_unlock(&arena->mutex);
|
||||||
gb_mutex_unlock(&arena->mutex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -156,8 +156,8 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) {
|
|||||||
|
|
||||||
|
|
||||||
i32 linker_stage(lbGenerator *gen) {
|
i32 linker_stage(lbGenerator *gen) {
|
||||||
i32 result = 0;
|
i32 result = 0;
|
||||||
Timings *timings = &global_timings;
|
Timings *timings = &global_timings;
|
||||||
|
|
||||||
String output_base = gen->output_base;
|
String output_base = gen->output_base;
|
||||||
|
|
||||||
@@ -2009,7 +2009,6 @@ int main(int arg_count, char const **arg_ptr) {
|
|||||||
arena_init(&permanent_arena, heap_allocator());
|
arena_init(&permanent_arena, heap_allocator());
|
||||||
temp_allocator_init(&temporary_allocator_data, 16*1024*1024);
|
temp_allocator_init(&temporary_allocator_data, 16*1024*1024);
|
||||||
arena_init(&global_ast_arena, heap_allocator());
|
arena_init(&global_ast_arena, heap_allocator());
|
||||||
permanent_arena.use_mutex = true;
|
|
||||||
|
|
||||||
init_string_buffer_memory();
|
init_string_buffer_memory();
|
||||||
init_string_interner();
|
init_string_interner();
|
||||||
|
|||||||
Reference in New Issue
Block a user