diff --git a/include/mimalloc.h b/include/mimalloc.h index 174d9a34c..2a2a7e35e 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_thread_visit_blocks(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 88969311e..6854312d3 100644 --- a/src/heap.c +++ b/src/heap.c @@ -735,3 +735,20 @@ 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_thread_visit_blocks(bool visit_blocks, mi_block_visit_fun* visitor, void* arg) { + mi_heap_t* heap = mi_heap_get_default(); + 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; +}