Files
Odin/base/runtime/heap_allocator_debugging.odin
Feoramund 541443fe33 Don't build feoramalloc on web platforms
Their allocation pathways are already tuned for their respective
platforms.
2025-05-08 11:06:01 -04:00

97 lines
2.8 KiB
Odin

#+build !js
#+build !orca
#+build !wasi
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.")
}
}