mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 07:08:48 +00:00
Wrap intrinsics.overflow_add to safe_add
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
package mem_virtual
|
package mem_virtual
|
||||||
|
|
||||||
import "core:mem"
|
import "core:mem"
|
||||||
import "core:intrinsics"
|
|
||||||
|
|
||||||
Arena_Kind :: enum uint {
|
Arena_Kind :: enum uint {
|
||||||
Growing = 0, // chained memory blocks (singly linked list)
|
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 {
|
switch arena.kind {
|
||||||
case .Growing:
|
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)
|
size = mem.align_forward_uint(size, alignment)
|
||||||
if arena.minimum_block_size == 0 {
|
if arena.minimum_block_size == 0 {
|
||||||
arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE
|
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) {
|
arena_check_temp :: proc(arena: ^Arena, loc := #caller_location) {
|
||||||
assert(arena.temp_count == 0, "Arena_Temp not been ended", loc)
|
assert(arena.temp_count == 0, "Arena_Temp not been ended", loc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
|
||||||
// }
|
|
||||||
@@ -136,13 +136,13 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint)
|
|||||||
}
|
}
|
||||||
|
|
||||||
alignment_offset := calc_alignment_offset(block, uintptr(alignment))
|
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 {
|
if !size_ok {
|
||||||
err = .Out_Of_Memory
|
err = .Out_Of_Memory
|
||||||
return
|
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
|
err = .Out_Of_Memory
|
||||||
return
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user