vppinfra: add clib_mem_free_s
[vpp.git] / src / vppinfra / mem.h
index 04c26d2..e565757 100644 (file)
 /* Per CPU heaps. */
 extern void *clib_per_cpu_mheaps[CLIB_MAX_MHEAPS];
 
+always_inline void
+clib_mem_set_thread_index (void)
+{
+  /*
+   * Find an unused slot in the per-cpu-mheaps array,
+   * and grab it for this thread. We need to be able to
+   * push/pop the thread heap without affecting other thread(s).
+   */
+  int i;
+  if (__os_thread_index != 0)
+    return;
+  for (i = 0; i < ARRAY_LEN (clib_per_cpu_mheaps); i++)
+    if (clib_atomic_bool_cmp_and_swap (&clib_per_cpu_mheaps[i],
+                                      0, clib_per_cpu_mheaps[0]))
+      {
+       os_set_thread_index (i);
+       break;
+      }
+  ASSERT (__os_thread_index > 0);
+}
+
 always_inline void *
 clib_mem_get_per_cpu_heap (void)
 {
@@ -232,7 +253,7 @@ clib_mem_realloc (void *p, uword new_size, uword old_size)
        copy_size = old_size;
       else
        copy_size = new_size;
-      clib_memcpy (q, p, copy_size);
+      clib_memcpy_fast (q, p, copy_size);
       clib_mem_free (p);
     }
   return q;
@@ -251,6 +272,14 @@ clib_mem_size (void *p)
 #endif
 }
 
+always_inline void
+clib_mem_free_s (void *p)
+{
+  uword size = clib_mem_size (p);
+  memset_s_inline (p, size, 0, size);
+  clib_mem_free (p);
+}
+
 always_inline void *
 clib_mem_get_heap (void)
 {
@@ -274,6 +303,8 @@ void clib_mem_validate (void);
 
 void clib_mem_trace (int enable);
 
+int clib_mem_is_traced (void);
+
 typedef struct
 {
   /* Total number of objects allocated. */
@@ -386,11 +417,13 @@ typedef struct
   uword requested_va;          /**< Request fixed position mapping */
 } clib_mem_vm_alloc_t;
 
+clib_error_t *clib_mem_create_fd (char *name, int *fdp);
 clib_error_t *clib_mem_create_hugetlb_fd (char *name, int *fdp);
 clib_error_t *clib_mem_vm_ext_alloc (clib_mem_vm_alloc_t * a);
 void clib_mem_vm_ext_free (clib_mem_vm_alloc_t * a);
-u64 clib_mem_vm_get_page_size (int fd);
-int clib_mem_vm_get_log2_page_size (int fd);
+u64 clib_mem_get_fd_page_size (int fd);
+uword clib_mem_get_default_hugepage_size (void);
+int clib_mem_get_fd_log2_page_size (int fd);
 u64 *clib_mem_vm_get_paddr (void *mem, int log2_page_size, int n_pages);
 
 typedef struct
@@ -404,6 +437,8 @@ typedef struct
 clib_error_t *clib_mem_vm_ext_map (clib_mem_vm_map_t * a);
 void clib_mem_vm_randomize_va (uword * requested_va, u32 log2_page_size);
 void mheap_trace (void *v, int enable);
+uword clib_mem_trace_enable_disable (uword enable);
+void clib_mem_trace (int enable);
 
 #include <vppinfra/error.h>    /* clib_panic */