aboutsummaryrefslogtreecommitdiff
path: root/src/common_memory.cpp
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2023-01-11 22:14:53 +0000
committerGitHub <noreply@github.com>2023-01-11 22:14:53 +0000
commit320062157f06d979db926fcbf407bbbdcc3028c1 (patch)
tree770bb60802ff24cc66c8e5e5837819969dc84cd6 /src/common_memory.cpp
parent86511d44e46b6271b01df2cd1ebb83b5496e143c (diff)
parentd7d6608142c8e169a7856c9e5965619809653903 (diff)
Merge pull request #2288 from odin-lang/compiler-improvements-2023-01
Multithreading Compiler Improvements 2023-01
Diffstat (limited to 'src/common_memory.cpp')
-rw-r--r--src/common_memory.cpp41
1 files changed, 12 insertions, 29 deletions
diff --git a/src/common_memory.cpp b/src/common_memory.cpp
index c8a62756a..4c77521e1 100644
--- a/src/common_memory.cpp
+++ b/src/common_memory.cpp
@@ -14,36 +14,24 @@ gb_internal gb_inline U const &bit_cast(V const &v) { return reinterpret_cast<U
gb_internal gb_inline i64 align_formula(i64 size, i64 align) {
- if (align > 0) {
- i64 result = size + align-1;
- return result - result%align;
- }
- return size;
+ i64 result = size + align-1;
+ return result - (i64)((u64)result%(u64)align);
}
gb_internal gb_inline isize align_formula_isize(isize size, isize align) {
- if (align > 0) {
- isize result = size + align-1;
- return result - result%align;
- }
- return size;
+ isize result = size + align-1;
+ return result - (isize)((usize)result%(usize)align);
}
gb_internal gb_inline void *align_formula_ptr(void *ptr, isize align) {
- if (align > 0) {
- uintptr result = (cast(uintptr)ptr) + align-1;
- return (void *)(result - result%align);
- }
- return ptr;
+ uintptr result = (cast(uintptr)ptr) + align-1;
+ return (void *)(result - result%align);
}
gb_global BlockingMutex global_memory_block_mutex;
-gb_global BlockingMutex global_memory_allocator_mutex;
gb_internal void platform_virtual_memory_init(void);
gb_internal void virtual_memory_init(void) {
- mutex_init(&global_memory_block_mutex);
- mutex_init(&global_memory_allocator_mutex);
platform_virtual_memory_init();
}
@@ -57,9 +45,9 @@ struct MemoryBlock {
};
struct Arena {
- MemoryBlock *curr_block;
- isize minimum_block_size;
- bool ignore_mutex;
+ MemoryBlock * curr_block;
+ isize minimum_block_size;
+ BlockingMutex mutex;
};
enum { DEFAULT_MINIMUM_BLOCK_SIZE = 8ll*1024ll*1024ll };
@@ -85,10 +73,7 @@ gb_internal isize arena_align_forward_offset(Arena *arena, isize alignment) {
gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) {
GB_ASSERT(gb_is_power_of_two(alignment));
- BlockingMutex *mutex = &global_memory_allocator_mutex;
- if (!arena->ignore_mutex) {
- mutex_lock(mutex);
- }
+ mutex_lock(&arena->mutex);
isize size = 0;
if (arena->curr_block != nullptr) {
@@ -115,9 +100,7 @@ gb_internal void *arena_alloc(Arena *arena, isize min_size, isize alignment) {
curr_block->used += size;
GB_ASSERT(curr_block->used <= curr_block->size);
- if (!arena->ignore_mutex) {
- mutex_unlock(mutex);
- }
+ mutex_unlock(&arena->mutex);
// NOTE(bill): memory will be zeroed by default due to virtual memory
return ptr;
@@ -306,7 +289,7 @@ gb_internal GB_ALLOCATOR_PROC(arena_allocator_proc) {
}
-gb_global gb_thread_local Arena permanent_arena = {nullptr, DEFAULT_MINIMUM_BLOCK_SIZE, true};
+gb_global gb_thread_local Arena permanent_arena = {nullptr, DEFAULT_MINIMUM_BLOCK_SIZE};
gb_internal gbAllocator permanent_allocator() {
return arena_allocator(&permanent_arena);
}