/* Spurious Coverity warnings be gone. */
clib_memset (&trace, 0, sizeof (trace));
- /* Skip our frame and mspace_get_aligned's frame */
- n_callers = clib_backtrace (trace.callers, ARRAY_LEN (trace.callers), 2);
- if (n_callers == 0)
- return;
-
clib_spinlock_lock (&tm->lock);
/* Turn off tracing to avoid embarrassment... */
save_enabled = tm->enabled;
tm->enabled = 0;
+ /* Skip our frame and mspace_get_aligned's frame */
+ n_callers = clib_backtrace (trace.callers, ARRAY_LEN (trace.callers), 2);
+ if (n_callers == 0)
+ goto out;
+
if (!tm->trace_by_callers)
tm->trace_by_callers =
hash_create_shmem (0, sizeof (trace.callers), sizeof (uword));
t->n_bytes += size;
t->offset = offset; /* keep a sample to autopsy */
hash_set (tm->trace_index_by_offset, offset, t - tm->traces);
+
+out:
tm->enabled = save_enabled;
clib_spinlock_unlock (&tm->lock);
}
return h;
}
-void *
+__clib_export void *
clib_mem_init (void *memory, uword memory_size)
{
return clib_mem_init_internal (memory, memory_size,
CLIB_MEM_PAGE_SZ_DEFAULT);
}
-void *
+__clib_export void *
clib_mem_init_with_page_size (uword memory_size,
clib_mem_page_sz_t log2_page_sz)
{
return clib_mem_init_internal (0, memory_size, log2_page_sz);
}
-void *
+__clib_export void *
clib_mem_init_thread_safe (void *memory, uword memory_size)
{
return clib_mem_init_internal (memory, memory_size,
CLIB_MEM_PAGE_SZ_DEFAULT);
}
-void
+__clib_export void
clib_mem_destroy (void)
{
mheap_trace_main_t *tm = &mheap_trace_main;
return s;
}
-u8 *
+__clib_export u8 *
format_clib_mem_heap (u8 * s, va_list * va)
{
clib_mem_heap_t *heap = va_arg (*va, clib_mem_heap_t *);
return s;
}
-void
+__clib_export void
clib_mem_get_heap_usage (clib_mem_heap_t * heap, clib_mem_usage_t * usage)
{
struct dlmallinfo mi = mspace_mallinfo (heap->mspace);
- /* TODO: Fill in some more values */
+ usage->bytes_total = mi.arena; /* non-mmapped space allocated from system */
+ usage->bytes_used = mi.uordblks; /* total allocated space */
+ usage->bytes_free = mi.fordblks; /* total free space */
+ usage->bytes_used_mmap = mi.hblkhd; /* space in mmapped regions */
+ usage->bytes_max = mi.usmblks; /* maximum total allocated space */
+ usage->bytes_free_reclaimed = mi.ordblks; /* number of free chunks */
+ usage->bytes_overhead = mi.keepcost; /* releasable (via malloc_trim) space */
+
+ /* Not supported */
+ usage->bytes_used_sbrk = 0;
usage->object_count = 0;
- usage->bytes_total = mi.arena;
- usage->bytes_overhead = 0;
- usage->bytes_max = 0;
- usage->bytes_used = mi.uordblks;
- usage->bytes_free = mi.fordblks;
- usage->bytes_free_reclaimed = 0;
}
/* Call serial number for debugger breakpoints. */
uword clib_mem_validate_serial = 0;
-void
+__clib_export void
mheap_trace (clib_mem_heap_t * h, int enable)
{
(void) mspace_enable_disable_trace (h->mspace, enable);
mheap_trace_main_free (&mheap_trace_main);
}
-void
+__clib_export void
clib_mem_trace (int enable)
{
mheap_trace_main_t *tm = &mheap_trace_main;
return mspace_is_traced (h->mspace);
}
-uword
+__clib_export uword
clib_mem_trace_enable_disable (uword enable)
{
uword rv;
return rv;
}
-clib_mem_heap_t *
+__clib_export clib_mem_heap_t *
clib_mem_create_heap (void *base, uword size, int is_locked, char *fmt, ...)
{
clib_mem_page_sz_t log2_page_sz = clib_mem_get_log2_page_size ();
return h;
}
-void
+__clib_export void
clib_mem_destroy_heap (clib_mem_heap_t * h)
{
mheap_trace_main_t *tm = &mheap_trace_main;
clib_mem_vm_unmap (h->base);
}
-uword
+__clib_export uword
clib_mem_get_heap_free_space (clib_mem_heap_t * h)
{
struct dlmallinfo dlminfo = mspace_mallinfo (h->mspace);
return dlminfo.fordblks;
}
-void *
+__clib_export void *
clib_mem_get_heap_base (clib_mem_heap_t * h)
{
return h->base;
}
-uword
+__clib_export uword
clib_mem_get_heap_size (clib_mem_heap_t * heap)
{
return heap->size;