diff options
| author | gingerBill <bill@gingerbill.org> | 2022-10-15 12:52:07 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-10-15 12:52:07 +0100 |
| commit | ff51c5ee5628774574f63e72f5efe6c49aaae54e (patch) | |
| tree | 578a0cfc29ecaa9d9a45f63f5c34c8df3451a443 | |
| parent | 7662808bc92271bbd5c9d6fad27301055f7e00ce (diff) | |
Wrap `intrinsics.overflow_add` to `safe_add`
| -rw-r--r-- | core/mem/virtual/arena.odin | 6 | ||||
| -rw-r--r-- | core/mem/virtual/arena_util.odin | 41 | ||||
| -rw-r--r-- | core/mem/virtual/virtual.odin | 11 |
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 |