Wrap intrinsics.overflow_add to safe_add

This commit is contained in:
gingerBill
2022-10-15 12:52:07 +01:00
parent 7662808bc9
commit ff51c5ee56
3 changed files with 10 additions and 48 deletions

View File

@@ -1,7 +1,6 @@
package mem_virtual
import "core:mem"
import "core:intrinsics"
Arena_Kind :: enum uint {
Growing = 0, // chained memory blocks (singly linked list)
@@ -57,7 +56,7 @@ arena_alloc :: proc(arena: ^Arena, size: uint, alignment: uint, loc := #caller_l
switch arena.kind {
case .Growing:
if arena.curr_block == nil || (intrinsics.overflow_add(arena.curr_block.used, size) or_else 0) > arena.curr_block.reserved {
if arena.curr_block == nil || (safe_add(arena.curr_block.used, size) or_else 0) > arena.curr_block.reserved {
size = mem.align_forward_uint(size, alignment)
if arena.minimum_block_size == 0 {
arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE
@@ -299,6 +298,3 @@ arena_temp_end :: proc(temp: Arena_Temp, loc := #caller_location) {
arena_check_temp :: proc(arena: ^Arena, loc := #caller_location) {
assert(arena.temp_count == 0, "Arena_Temp not been ended", loc)
}

View File

@@ -1,41 +0,0 @@
package mem_virtual
// arena_init :: proc{
// static_arena_init,
// growing_arena_init,
// }
// arena_temp_begin :: proc{
// static_arena_temp_begin,
// growing_arena_temp_begin,
// }
// arena_temp_end :: proc{
// static_arena_temp_end,
// growing_arena_temp_end,
// }
// arena_check_temp :: proc{
// static_arena_check_temp,
// growing_arena_check_temp,
// }
// arena_allocator :: proc{
// static_arena_allocator,
// growing_arena_allocator,
// }
// arena_alloc :: proc{
// static_arena_alloc,
// growing_arena_alloc,
// }
// arena_free_all :: proc{
// static_arena_free_all,
// growing_arena_free_all,
// }
// arena_destroy :: proc{
// static_arena_destroy,
// growing_arena_destroy,
// }

View File

@@ -136,13 +136,13 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint)
}
alignment_offset := calc_alignment_offset(block, uintptr(alignment))
size, size_ok := intrinsics.overflow_add(min_size, alignment_offset)
size, size_ok := safe_add(min_size, alignment_offset)
if !size_ok {
err = .Out_Of_Memory
return
}
if to_be_used, ok := intrinsics.overflow_add(block.used, size); !ok || to_be_used > block.reserved {
if to_be_used, ok := safe_add(block.used, size); !ok || to_be_used > block.reserved {
err = .Out_Of_Memory
return
}
@@ -166,3 +166,10 @@ memory_block_dealloc :: proc(block_to_free: ^Memory_Block) {
}
}
@(private)
safe_add :: #force_inline proc "contextless" (x, y: uint) -> (uint, bool) {
z, did_overflow := intrinsics.overflow_add(x, y)
return z, !did_overflow
}