aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflysand7 <thebumboni@gmail.com>2024-09-08 14:17:32 +1100
committerflysand7 <thebumboni@gmail.com>2024-09-08 14:17:32 +1100
commit299accb717ff376bbb063cde7585d582b658d405 (patch)
tree3d8544a4d01350b9a8da56833e7800b4e1c2211a
parent3b30bc305c9da737545c96173b566efb1e10b466 (diff)
[mem]: Put panic allocator after nil allocator, adjust @require_results
-rw-r--r--core/mem/allocators.odin115
1 files changed, 57 insertions, 58 deletions
diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin
index 2ee397316..649d5466a 100644
--- a/core/mem/allocators.odin
+++ b/core/mem/allocators.odin
@@ -3,6 +3,7 @@ package mem
import "base:intrinsics"
import "base:runtime"
+@(require_results)
nil_allocator :: proc() -> Allocator {
return Allocator{
procedure = nil_allocator_proc,
@@ -21,6 +22,62 @@ nil_allocator_proc :: proc(
return nil, nil
}
+
+
+@(require_results)
+panic_allocator :: proc() -> Allocator {
+ return Allocator{
+ procedure = panic_allocator_proc,
+ data = nil,
+ }
+}
+
+panic_allocator_proc :: proc(
+ allocator_data: rawptr,
+ mode: Allocator_Mode,
+ size, alignment: int,
+ old_memory: rawptr,
+ old_size: int,
+ loc := #caller_location,
+) -> ([]byte, Allocator_Error) {
+ switch mode {
+ case .Alloc:
+ if size > 0 {
+ panic("mem: panic allocator, .Alloc called", loc=loc)
+ }
+ case .Alloc_Non_Zeroed:
+ if size > 0 {
+ panic("mem: panic allocator, .Alloc_Non_Zeroed called", loc=loc)
+ }
+ case .Resize:
+ if size > 0 {
+ panic("mem: panic allocator, .Resize called", loc=loc)
+ }
+ case .Resize_Non_Zeroed:
+ if size > 0 {
+ panic("mem: panic allocator, .Resize_Non_Zeroed called", loc=loc)
+ }
+ case .Free:
+ if old_memory != nil {
+ panic("mem: panic allocator, .Free called", loc=loc)
+ }
+ case .Free_All:
+ panic("mem: panic allocator, .Free_All called", loc=loc)
+ case .Query_Features:
+ set := (^Allocator_Mode_Set)(old_memory)
+ if set != nil {
+ set^ = {.Query_Features}
+ }
+ return nil, nil
+
+ case .Query_Info:
+ panic("mem: panic allocator, .Query_Info called", loc=loc)
+ }
+ return nil, nil
+}
+
+
+
Arena :: struct {
data: []byte,
offset: int,
@@ -300,7 +357,6 @@ scratch_alloc_bytes_non_zeroed :: proc(
return ptr, err
}
-@(require_results)
scratch_free :: proc(s: ^Scratch, ptr: rawptr, loc := #caller_location) -> Allocator_Error {
if s.data == nil {
panic("Free on an uninitialized scratch allocator", loc)
@@ -555,7 +611,6 @@ stack_alloc_bytes_non_zeroed :: proc(
return byte_slice(rawptr(next_addr), size), nil
}
-@(require_results)
stack_free :: proc(
s: ^Stack,
old_memory: rawptr,
@@ -824,7 +879,6 @@ small_stack_alloc_bytes_non_zeroed :: proc(
return byte_slice(rawptr(next_addr), size), nil
}
-@(require_results)
small_stack_free :: proc(
s: ^Small_Stack,
old_memory: rawptr,
@@ -1254,60 +1308,6 @@ dynamic_arena_allocator_proc :: proc(
-panic_allocator_proc :: proc(
- allocator_data: rawptr,
- mode: Allocator_Mode,
- size, alignment: int,
- old_memory: rawptr,
- old_size: int,
- loc := #caller_location,
-) -> ([]byte, Allocator_Error) {
- switch mode {
- case .Alloc:
- if size > 0 {
- panic("mem: panic allocator, .Alloc called", loc=loc)
- }
- case .Alloc_Non_Zeroed:
- if size > 0 {
- panic("mem: panic allocator, .Alloc_Non_Zeroed called", loc=loc)
- }
- case .Resize:
- if size > 0 {
- panic("mem: panic allocator, .Resize called", loc=loc)
- }
- case .Resize_Non_Zeroed:
- if size > 0 {
- panic("mem: panic allocator, .Resize_Non_Zeroed called", loc=loc)
- }
- case .Free:
- if old_memory != nil {
- panic("mem: panic allocator, .Free called", loc=loc)
- }
- case .Free_All:
- panic("mem: panic allocator, .Free_All called", loc=loc)
- case .Query_Features:
- set := (^Allocator_Mode_Set)(old_memory)
- if set != nil {
- set^ = {.Query_Features}
- }
- return nil, nil
-
- case .Query_Info:
- panic("mem: panic allocator, .Query_Info called", loc=loc)
- }
- return nil, nil
-}
-
-@(require_results)
-panic_allocator :: proc() -> Allocator {
- return Allocator{
- procedure = panic_allocator_proc,
- data = nil,
- }
-}
-
-
-
Buddy_Block :: struct #align(align_of(uint)) {
size: uint,
is_free: bool,
@@ -1513,7 +1513,6 @@ buddy_allocator_alloc_bytes_non_zeroed :: proc(b: ^Buddy_Allocator, size: uint)
return nil, nil
}
-@(require_results)
buddy_allocator_free :: proc(b: ^Buddy_Allocator, ptr: rawptr) -> Allocator_Error {
if ptr != nil {
if !(b.head <= ptr && ptr <= b.tail) {