stats: coverity errors leaking fd
[vpp.git] / src / vpp / stats / stat_segment.c
index 968c056..6a666f5 100644 (file)
@@ -22,7 +22,6 @@
 #undef HAVE_MEMFD_CREATE
 #include <vppinfra/linux/syscall.h>
 #include <vpp-api/client/stat_client.h>
-#include <vppinfra/mheap.h>
 
 stat_segment_main_t stat_segment_main;
 
@@ -282,7 +281,8 @@ stat_set_simple_counter (stat_segment_directory_entry_t * ep,
                         u32 thread_index, u32 index, u64 value)
 {
   ASSERT (ep->data);
-  counter_t *cb = ep->data;
+  counter_t **counters = ep->data;
+  counter_t *cb = counters[thread_index];
   cb[index] = value;
 }
 
@@ -330,13 +330,15 @@ vlib_map_stat_segment_init (void)
 
   mfd = clib_mem_vm_create_fd (sm->log2_page_sz, mem_name);
 
-  /* Set size */
-  if ((ftruncate (mfd, memory_size)) == -1)
-    return clib_error_return (0, "stat segment ftruncate failure");
-
   if (mfd == -1)
     return clib_error_return (0, "stat segment memory fd failure: %U",
                              format_clib_error, clib_mem_get_last_error ());
+  /* Set size */
+  if ((ftruncate (mfd, memory_size)) == -1)
+    {
+      close (mfd);
+      return clib_error_return (0, "stat segment ftruncate failure");
+    }
 
   memaddr = clib_mem_vm_map_shared (0, memory_size, mfd, 0, mem_name);
 
@@ -345,9 +347,9 @@ vlib_map_stat_segment_init (void)
 
   sys_page_sz = clib_mem_get_page_size ();
 
-  heap = create_mspace_with_base (((u8 *) memaddr) + sys_page_sz, memory_size
-                                 - sys_page_sz, 1 /* locked */ );
-  mspace_disable_expand (heap);
+  heap = clib_mem_create_heap (((u8 *) memaddr) + sys_page_sz, memory_size
+                              - sys_page_sz, 1 /* locked */ ,
+                              "stat segment");
   sm->heap = heap;
   sm->memfd = mfd;
 
@@ -381,7 +383,7 @@ vlib_map_stat_segment_init (void)
 
   /* Total shared memory size */
   clib_mem_usage_t usage;
-  mheap_usage (sm->heap, &usage);
+  clib_mem_get_heap_usage (sm->heap, &usage);
   sm->directory_vector[STAT_COUNTER_MEM_STATSEG_TOTAL].value =
     usage.bytes_total;
 
@@ -475,7 +477,8 @@ show_stat_segment_command_fn (vlib_main_t * vm,
   if (verbose)
     {
       ASSERT (sm->heap);
-      vlib_cli_output (vm, "%U", format_mheap, sm->heap, 0 /* verbose */ );
+      vlib_cli_output (vm, "%U", format_clib_mem_heap, sm->heap,
+                      0 /* verbose */ );
     }
 
   return 0;
@@ -658,7 +661,7 @@ do_stat_segment_updates (stat_segment_main_t * sm)
 
   /* Stats segment memory heap counter */
   clib_mem_usage_t usage;
-  mheap_usage (sm->heap, &usage);
+  clib_mem_get_heap_usage (sm->heap, &usage);
   sm->directory_vector[STAT_COUNTER_MEM_STATSEG_USED].value =
     usage.bytes_used;
 
@@ -667,10 +670,10 @@ do_stat_segment_updates (stat_segment_main_t * sm)
 
   /* *INDENT-OFF* */
   stat_segment_gauges_pool_t *g;
-  pool_foreach(g, sm->gauges,
-  ({
+  pool_foreach (g, sm->gauges)
+   {
     g->fn(&sm->directory_vector[g->directory_index], g->caller_index);
-  }));
+  }
   /* *INDENT-ON* */
 
   /* Heartbeat, so clients detect we're still here */