diff --git a/include/mimalloc.h b/include/mimalloc.h index 174d9a34..42f7a3bc 100644 --- a/include/mimalloc.h +++ b/include/mimalloc.h @@ -287,6 +287,9 @@ typedef bool (mi_cdecl mi_block_visit_fun)(const mi_heap_t* heap, const mi_heap_ mi_decl_export bool mi_heap_visit_blocks(const mi_heap_t* heap, bool visit_blocks, mi_block_visit_fun* visitor, void* arg); +//Visiting all blocks of all heaps in a thread +mi_decl_export bool mi_visit_blocks(const mi_heap_t* heap ,bool visit_blocks, mi_block_visit_fun* visitor, void* arg); + // Experimental mi_decl_nodiscard mi_decl_export bool mi_is_in_heap_region(const void* p) mi_attr_noexcept; mi_decl_nodiscard mi_decl_export bool mi_is_redirected(void) mi_attr_noexcept; diff --git a/src/heap.c b/src/heap.c index 88969311..54d9a980 100644 --- a/src/heap.c +++ b/src/heap.c @@ -735,3 +735,19 @@ bool mi_heap_visit_blocks(const mi_heap_t* heap, bool visit_blocks, mi_block_vis mi_visit_blocks_args_t args = { visit_blocks, visitor, arg }; return mi_heap_visit_areas(heap, &mi_heap_area_visitor, &args); } + +//Visiting all blocks of all heaps in a thread +bool mi_visit_blocks(const mi_heap_t* heap, bool visit_blocks, mi_block_visit_fun* visitor, void* arg) { + mi_assert_internal(heap != NULL); + if (heap == NULL) return false; + mi_heap_t* curr = heap->tld->heaps; + while (curr != NULL) { + mi_heap_t* next = curr->next; + if(!mi_heap_visit_blocks(curr, visit_blocks, visitor, arg)){ + return false; + } + curr = next; + } + return true; +} +