aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-10-15 12:52:07 +0100
committergingerBill <bill@gingerbill.org>2022-10-15 12:52:07 +0100
commitff51c5ee5628774574f63e72f5efe6c49aaae54e (patch)
tree578a0cfc29ecaa9d9a45f63f5c34c8df3451a443
parent7662808bc92271bbd5c9d6fad27301055f7e00ce (diff)
Wrap `intrinsics.overflow_add` to `safe_add`
-rw-r--r--core/mem/virtual/arena.odin6
-rw-r--r--core/mem/virtual/arena_util.odin41
-rw-r--r--core/mem/virtual/virtual.odin11
3 files changed, 10 insertions, 48 deletions
diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin
index 57dbc2168..45426eddc 100644
--- a/core/mem/virtual/arena.odin
+++ b/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)
}
-
-
-
diff --git a/core/mem/virtual/arena_util.odin b/core/mem/virtual/arena_util.odin
deleted file mode 100644
index f721c4ffa..000000000
--- a/core/mem/virtual/arena_util.odin
+++ /dev/null
@@ -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,
-// } \ No newline at end of file
diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin
index b209d06e4..426482fff 100644
--- a/core/mem/virtual/virtual.odin
+++ b/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
+} \ No newline at end of file