aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-08-16 22:07:40 +0100
committergingerBill <bill@gingerbill.org>2020-08-16 22:07:40 +0100
commit033b46def884b94d3095f1f4fb71ca9cf0819081 (patch)
tree13d510a3d499533524a2fd56681ca88a50a3a433
parent1f571f48e5c3cf823f068e464324ff218314498f (diff)
Add `mem.Allocator_Mode.Query_Features, `mem.Allocator_Mode_Set`, `mem.query_features`
-rw-r--r--core/mem/alloc.odin18
-rw-r--r--core/mem/allocators.odin56
-rw-r--r--core/os/os.odin7
-rw-r--r--core/runtime/core.odin5
-rw-r--r--core/runtime/default_allocators.odin7
5 files changed, 92 insertions, 1 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;
diff --git a/core/os/os.odin b/core/os/os.odin
index c78b80417..9342355cf 100644
--- a/core/os/os.odin
+++ b/core/os/os.odin
@@ -194,6 +194,13 @@ heap_allocator_proc :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode,
return aligned_alloc(size, alignment);
}
return aligned_resize(old_memory, old_size, size, alignment);
+
+ case .Query_Features:
+ set := (^mem.Allocator_Mode_Set)(old_memory);
+ if set != nil {
+ set^ = {.Alloc, .Free, .Resize, .Query_Features};
+ }
+ return set;
}
return nil;
diff --git a/core/runtime/core.odin b/core/runtime/core.odin
index 1ed16d127..d3522c268 100644
--- a/core/runtime/core.odin
+++ b/core/runtime/core.odin
@@ -251,8 +251,11 @@ Allocator_Mode :: enum byte {
Free,
Free_All,
Resize,
+ Query_Features,
}
+Allocator_Mode_Set :: distinct bit_set[Allocator_Mode];
+
Allocator_Proc :: #type proc(allocator_data: rawptr, mode: Allocator_Mode,
size, alignment: int,
old_memory: rawptr, old_size: int, flags: u64 = 0, location: Source_Code_Location = #caller_location) -> rawptr;
@@ -263,7 +266,7 @@ Allocator :: struct {
// Logging stuff
-Logger_Level :: enum {
+Logger_Level :: enum uint {
Debug = 0,
Info = 10,
Warning = 20,
diff --git a/core/runtime/default_allocators.odin b/core/runtime/default_allocators.odin
index 525bb3bc1..3643fccdf 100644
--- a/core/runtime/default_allocators.odin
+++ b/core/runtime/default_allocators.odin
@@ -132,6 +132,13 @@ default_temp_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode
ptr := default_temp_allocator_proc(allocator_data, Allocator_Mode.Alloc, size, alignment, old_memory, old_size, flags, loc);
mem_copy(ptr, old_memory, old_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;