Browse Source

Wrap `intrinsics.overflow_add` to `safe_add`

gingerBill 2 years ago
parent
commit
ff51c5ee56
3 changed files with 10 additions and 48 deletions
  1. 1 5
      core/mem/virtual/arena.odin
  2. 0 41
      core/mem/virtual/arena_util.odin
  3. 9 2
      core/mem/virtual/virtual.odin

+ 1 - 5
core/mem/virtual/arena.odin

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

+ 0 - 41
core/mem/virtual/arena_util.odin

@@ -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,
-// }

+ 9 - 2
core/mem/virtual/virtual.odin

@@ -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
+}