[mem]: Put panic allocator after nil allocator, adjust @require_results

This commit is contained in:
flysand7
2024-09-08 14:17:32 +11:00
parent 3b30bc305c
commit 299accb717

View File

@@ -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) {