diff options
| author | gingerBill <bill@gingerbill.org> | 2020-08-16 22:07:40 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-08-16 22:07:40 +0100 |
| commit | 033b46def884b94d3095f1f4fb71ca9cf0819081 (patch) | |
| tree | 13d510a3d499533524a2fd56681ca88a50a3a433 /core/mem | |
| parent | 1f571f48e5c3cf823f068e464324ff218314498f (diff) | |
Add `mem.Allocator_Mode.Query_Features, `mem.Allocator_Mode_Set`, `mem.query_features`
Diffstat (limited to 'core/mem')
| -rw-r--r-- | core/mem/alloc.odin | 18 | ||||
| -rw-r--r-- | core/mem/allocators.odin | 56 |
2 files changed, 74 insertions, 0 deletions
diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index 80969aa1f..0ed691dd6 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -10,9 +10,15 @@ Allocator_Mode :: enum byte { Free, Free_All, Resize, + Query_Features, } */ +Allocator_Mode_Set :: runtime.Allocator_Mode_Set; +/* +Allocator_Mode_Set :: distinct bit_set[Allocator_Mode]; +*/ + Allocator_Proc :: runtime.Allocator_Proc; /* Allocator_Proc :: #type proc(allocator_data: rawptr, mode: Allocator_Mode, @@ -63,6 +69,18 @@ resize :: inline proc(ptr: rawptr, old_size, new_size: int, alignment: int = DEF return allocator.procedure(allocator.data, Allocator_Mode.Resize, new_size, alignment, ptr, old_size, 0, loc); } +query_features :: proc(allocator: Allocator, loc := #caller_location) -> Allocator_Mode_Set { + if allocator.procedure != nil { + set: Allocator_Mode_Set; + res := allocator.procedure(allocator.data, Allocator_Mode.Query_Features, 0, 0, &set, 0, 0, loc); + if res == &set { + return set; + } + } + return nil; +} + + delete_string :: proc(str: string, allocator := context.allocator, loc := #caller_location) { free(raw_data(str), allocator, loc); diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 3a6b95396..8c27f6887 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -74,6 +74,13 @@ arena_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, case .Resize: return default_resize_align(old_memory, old_size, size, alignment, arena_allocator(arena)); + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Free_All, .Resize, .Query_Features}; + } + return set; } return nil; @@ -197,6 +204,13 @@ scratch_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, return old_memory; } return scratch_allocator_proc(allocator_data, Allocator_Mode.Alloc, size, alignment, old_memory, old_size, flags, loc); + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Free, .Free_All, .Resize, .Query_Features}; + } + return set; } return nil; @@ -348,6 +362,13 @@ stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, } return old_memory; + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Free, .Free_All, .Resize, .Query_Features}; + } + return set; } return nil; @@ -468,6 +489,13 @@ small_stack_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, ptr := raw_alloc(s, size, align); copy(ptr, old_memory, min(old_size, size)); return ptr; + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Free, .Free_All, .Resize, .Query_Features}; + } + return set; } return nil; @@ -519,6 +547,13 @@ dynamic_pool_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode ptr := dynamic_pool_alloc(pool, size); copy(ptr, old_memory, old_size); return ptr; + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Free_All, .Resize, .Query_Features}; + } + return set; } return nil; } @@ -654,6 +689,13 @@ panic_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, } case .Free_All: panic("mem: panic allocator, .Free_All called"); + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Query_Features}; + } + return set; } return nil; @@ -701,6 +743,13 @@ alloca_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, // Do nothing case .Free_All: // Do nothing + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Resize, .Query_Features}; + } + return set; } return nil; } @@ -774,6 +823,13 @@ tracking_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, si if data.clear_on_free_all { clear_map(&data.allocation_map); } + + case .Query_Features: + set := (^Allocator_Mode_Set)(old_memory); + if set != nil { + set^ = {.Alloc, .Free, .Free_All, .Resize, .Query_Features}; + } + return set; } return result; |