|
@@ -59,6 +59,8 @@ struct MemoryBlock {
|
|
struct Arena {
|
|
struct Arena {
|
|
MemoryBlock * curr_block;
|
|
MemoryBlock * curr_block;
|
|
isize minimum_block_size;
|
|
isize minimum_block_size;
|
|
|
|
+ bool use_local_mutex;
|
|
|
|
+ BlockingMutex local_mutex;
|
|
};
|
|
};
|
|
|
|
|
|
enum { DEFAULT_MINIMUM_BLOCK_SIZE = 8ll*1024ll*1024ll };
|
|
enum { DEFAULT_MINIMUM_BLOCK_SIZE = 8ll*1024ll*1024ll };
|
|
@@ -79,15 +81,25 @@ isize arena_align_forward_offset(Arena *arena, isize alignment) {
|
|
return alignment_offset;
|
|
return alignment_offset;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void arena_init_local_mutex(Arena *arena) {
|
|
|
|
+ mutex_init(&arena->local_mutex);
|
|
|
|
+ arena->use_local_mutex = true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
void *arena_alloc(Arena *arena, isize min_size, isize alignment) {
|
|
void *arena_alloc(Arena *arena, isize min_size, isize alignment) {
|
|
GB_ASSERT(gb_is_power_of_two(alignment));
|
|
GB_ASSERT(gb_is_power_of_two(alignment));
|
|
|
|
|
|
- isize size = 0;
|
|
|
|
|
|
+
|
|
|
|
+ BlockingMutex *mutex = &global_memory_allocator_mutex;
|
|
|
|
+ if (arena->use_local_mutex) {
|
|
|
|
+ mutex = &arena->local_mutex;
|
|
|
|
+ }
|
|
|
|
|
|
- // TODO(bill): make it so that this can be done lock free (if possible)
|
|
|
|
- mutex_lock(&global_memory_allocator_mutex);
|
|
|
|
|
|
+ mutex_lock(mutex);
|
|
|
|
|
|
|
|
+ isize size = 0;
|
|
if (arena->curr_block != nullptr) {
|
|
if (arena->curr_block != nullptr) {
|
|
size = min_size + arena_align_forward_offset(arena, alignment);
|
|
size = min_size + arena_align_forward_offset(arena, alignment);
|
|
}
|
|
}
|
|
@@ -112,7 +124,7 @@ void *arena_alloc(Arena *arena, isize min_size, isize alignment) {
|
|
curr_block->used += size;
|
|
curr_block->used += size;
|
|
GB_ASSERT(curr_block->used <= curr_block->size);
|
|
GB_ASSERT(curr_block->used <= curr_block->size);
|
|
|
|
|
|
- mutex_unlock(&global_memory_allocator_mutex);
|
|
|
|
|
|
+ mutex_unlock(mutex);
|
|
|
|
|
|
// NOTE(bill): memory will be zeroed by default due to virtual memory
|
|
// NOTE(bill): memory will be zeroed by default due to virtual memory
|
|
return ptr;
|
|
return ptr;
|