+ else if (strchr (fmt, '%'))
+ {
+ va_list va;
+ va_start (va, fmt);
+ s = va_format (0, fmt, &va);
+ vec_add1 (s, 0);
+ va_end (va);
+ name = (char *) s;
+ }
+ else
+ name = fmt;
+
+ h = clib_mem_create_heap_internal (base, size, log2_page_sz, is_locked,
+ name);
+ vec_free (s);
+ return h;
+}
+
+__clib_export void
+clib_mem_destroy_heap (clib_mem_heap_t * h)
+{
+ mheap_trace_main_t *tm = &mheap_trace_main;
+
+ if (tm->enabled && h->mspace == tm->current_traced_mheap)
+ tm->enabled = 0;
+
+ destroy_mspace (h->mspace);
+ if (h->flags & CLIB_MEM_HEAP_F_UNMAP_ON_DESTROY)
+ clib_mem_vm_unmap (h->base);
+}
+
+__clib_export uword
+clib_mem_get_heap_free_space (clib_mem_heap_t * h)
+{
+ struct dlmallinfo dlminfo = mspace_mallinfo (h->mspace);
+ return dlminfo.fordblks;
+}
+
+__clib_export void *
+clib_mem_get_heap_base (clib_mem_heap_t * h)
+{
+ return h->base;
+}
+
+__clib_export uword
+clib_mem_get_heap_size (clib_mem_heap_t * heap)
+{
+ return heap->size;