vppinfra: expose raw memory traces

Add clib_mem_trace_dup which return copy of memory traces and
can be used to save memory trace in different formats.

Type: improvement

Change-Id: I731860cdc65e6c5255620a6778ce6c893a493b1d
Signed-off-by: Matus Fabian <matfabia@cisco.com>
diff --git a/src/vppinfra/mem.h b/src/vppinfra/mem.h
index 75015d5..ab9c5da 100644
--- a/src/vppinfra/mem.h
+++ b/src/vppinfra/mem.h
@@ -299,10 +299,27 @@
 
 void clib_mem_exit (void);
 
+typedef struct
+{
+  /* Address of callers: outer first, inner last. */
+  uword callers[12];
+
+  /* Count of allocations with this traceback. */
+  u32 n_allocations;
+
+  /* Count of bytes allocated with this traceback. */
+  u32 n_bytes;
+
+  /* Offset of this item */
+  uword offset;
+} mheap_trace_t;
+
 void clib_mem_trace (int enable);
 
 int clib_mem_is_traced (void);
 
+mheap_trace_t *clib_mem_trace_dup (clib_mem_heap_t *heap);
+
 typedef struct
 {
   /* Total number of objects allocated. */
diff --git a/src/vppinfra/mem_dlmalloc.c b/src/vppinfra/mem_dlmalloc.c
index e98687f..d5ff21e 100644
--- a/src/vppinfra/mem_dlmalloc.c
+++ b/src/vppinfra/mem_dlmalloc.c
@@ -23,21 +23,6 @@
 
 typedef struct
 {
-  /* Address of callers: outer first, inner last. */
-  uword callers[12];
-
-  /* Count of allocations with this traceback. */
-  u32 n_allocations;
-
-  /* Count of bytes allocated with this traceback. */
-  u32 n_bytes;
-
-  /* Offset of this item */
-  uword offset;
-} mheap_trace_t;
-
-typedef struct
-{
   clib_spinlock_t lock;
 
   mheap_trace_t *traces;
@@ -574,6 +559,23 @@
   return rv;
 }
 
+__clib_export mheap_trace_t *
+clib_mem_trace_dup (clib_mem_heap_t *heap)
+{
+  mheap_trace_main_t *tm = &mheap_trace_main;
+  mheap_trace_t *traces_copy = 0;
+
+  clib_spinlock_lock (&tm->lock);
+  if (vec_len (tm->traces) > 0 && heap == tm->current_traced_mheap)
+    {
+      traces_copy = vec_dup (tm->traces);
+      qsort (traces_copy, vec_len (traces_copy), sizeof (traces_copy[0]),
+	     mheap_trace_sort);
+    }
+  clib_spinlock_unlock (&tm->lock);
+  return traces_copy;
+}
+
 __clib_export clib_mem_heap_t *
 clib_mem_create_heap (void *base, uword size, int is_locked, char *fmt, ...)
 {