private static bool mi_heap_visit_areas_page(mi_heap_t *heap, mi_page_queue_t *pq, mi_page_t *page, void *vfun, void *arg) { GCHandle handle = GCHandle.FromIntPtr((IntPtr)vfun); mi_heap_area_visit_fun fun = (mi_heap_area_visit_fun)handle.Target !; mi_heap_area_ex_t xarea; nuint bsize = mi_page_block_size(page); xarea.page = page; xarea.area.reserved = page->reserved * bsize; xarea.area.committed = page->capacity * bsize; xarea.area.blocks = _mi_page_start(_mi_page_segment(page), page, out _); xarea.area.used = page->used; xarea.area.block_size = bsize; return(fun(heap, &xarea, arg)); }
// Visit all heap pages as areas private static bool mi_heap_visit_areas([NativeTypeName("const mi_heap_t*")] mi_heap_t *heap, [NativeTypeName("mi_heap_area_visit_fun*")] mi_heap_area_visit_fun visitor, void *arg) { if (visitor == null) { return(false); } // note: function pointer to void* :-{ GCHandle handle = GCHandle.Alloc(visitor); try { return(mi_heap_visit_pages(heap, mi_heap_visit_areas_page, (void *)GCHandle.ToIntPtr(handle), arg)); } finally { handle.Free(); } }