mirror of
https://github.com/odin-lang/Odin.git
synced 2026-08-05 05:38:31 +00:00
- Add the test bench for the allocator - Move old allocator code to the test bench - Fix `heap_resize` usage in `os2/env_linux.odin` to fit new API requiring `old_size`
94 lines
2.8 KiB
Odin
94 lines
2.8 KiB
Odin
package runtime
|
|
|
|
import "base:intrinsics"
|
|
|
|
ODIN_DEBUG_HEAP :: #config(ODIN_DEBUG_HEAP, false)
|
|
|
|
Heap_Code_Coverage_Type :: enum {
|
|
Alloc_Bin,
|
|
Alloc_Collected_Remote_Frees,
|
|
Alloc_Heap_Initialized,
|
|
Alloc_Huge,
|
|
Alloc_Slab_Wide,
|
|
Alloc_Slab_Wide_Needed_New_Superpage,
|
|
Alloc_Slab_Wide_Used_Available_Superpage,
|
|
Alloc_Zeroed_Memory,
|
|
Freed_Bin_Freed_Slab_Which_Was_Fully_Used,
|
|
Freed_Bin_Freed_Superpage,
|
|
Freed_Bin_Reopened_Full_Slab,
|
|
Freed_Bin_Updated_Slab_Next_Free_Sector,
|
|
Freed_Huge_Allocation,
|
|
Freed_Wide_Slab,
|
|
Heap_Expanded_Cache_Data,
|
|
Huge_Alloc_Size_Adjusted,
|
|
Huge_Alloc_Size_Set_To_Superpage,
|
|
Merged_Remote_Frees,
|
|
Orphaned_Superpage_Freed_Slab,
|
|
Orphaned_Superpage_Merged_Remote_Frees,
|
|
Remotely_Freed_Bin,
|
|
Remotely_Freed_Bin_Caused_Remote_Superpage_Caching,
|
|
Remotely_Freed_Wide_Slab,
|
|
Resize_Caused_Memory_Zeroing,
|
|
Resize_Crossed_Size_Categories,
|
|
Resize_Huge,
|
|
Resize_Huge_Caused_Memory_Zeroing,
|
|
Resize_Huge_Size_Adjusted,
|
|
Resize_Huge_Size_Set_To_Superpage,
|
|
Resize_Kept_Old_Pointer,
|
|
Resize_Wide_Slab_Caused_Memory_Zeroing,
|
|
Resize_Wide_Slab_Expanded_In_Place,
|
|
Resize_Wide_Slab_Failed_To_Find_Contiguous_Expansion,
|
|
Resize_Wide_Slab_From_Remote_Thread,
|
|
Resize_Wide_Slab_Kept_Old_Pointer,
|
|
Resize_Wide_Slab_Shrunk_In_Place,
|
|
Slab_Adjusted_For_Partial_Sector,
|
|
Superpage_Add_Remote_Free_Guarded_With_Masterless,
|
|
Superpage_Add_Remote_Free_Guarded_With_Set,
|
|
Superpage_Added_Remote_Free,
|
|
Superpage_Added_To_Open_Cache_By_Freeing_Wide_Slab,
|
|
Superpage_Added_To_Open_Cache_By_Resizing_Wide_Slab,
|
|
Superpage_Added_To_Open_Cache_By_Slab,
|
|
Superpage_Adopted_From_Orphanage,
|
|
Superpage_Created_By_Empty_Orphanage,
|
|
Superpage_Freed_By_Exiting_Thread,
|
|
Superpage_Freed_By_Wide_Slab,
|
|
Superpage_Freed_On_Full_Orphanage,
|
|
Superpage_Linked,
|
|
Superpage_Cache_Block_Cleared,
|
|
Superpage_Orphaned_By_Exiting_Thread,
|
|
Superpage_Pushed_To_Orphanage,
|
|
Superpage_Registered_With_Free_Slabs,
|
|
Superpage_Registered_With_Slab_In_Use,
|
|
Superpage_Removed_From_Open_Cache_By_Slab,
|
|
Superpage_Unlinked_Non_Tail,
|
|
Superpage_Unlinked_Tail,
|
|
Superpage_Unregistered,
|
|
Superpage_Updated_Next_Free_Slab_Index,
|
|
Superpage_Updated_Next_Free_Slab_Index_As_Empty,
|
|
}
|
|
|
|
when ODIN_DEBUG_HEAP {
|
|
heap_global_code_coverage: [Heap_Code_Coverage_Type]int // atomic
|
|
}
|
|
|
|
@(private, disabled=!ODIN_DEBUG_HEAP)
|
|
heap_debug_cover :: #force_inline proc "contextless" (type: Heap_Code_Coverage_Type) {
|
|
when ODIN_DEBUG_HEAP {
|
|
intrinsics.atomic_add_explicit(&heap_global_code_coverage[type], 1, .Release)
|
|
}
|
|
}
|
|
|
|
_check_heap_code_coverage :: proc "contextless" () -> bool {
|
|
when ODIN_DEBUG_HEAP {
|
|
intrinsics.atomic_thread_fence(.Seq_Cst)
|
|
for t in heap_global_code_coverage {
|
|
if t == 0 {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
} else {
|
|
panic_contextless("ODIN_DEBUG_HEAP is not enabled, therefore the results of this procedure are meaningless.")
|
|
}
|
|
}
|