コード例 #1
0
        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));
        }
コード例 #2
0
        // 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();
            }
        }