vlib: create unix runtime directory
[vpp.git] / src / vpp / stats / stat_segment.c
index c3521cf..303d704 100644 (file)
@@ -67,12 +67,14 @@ lookup_or_create_hash_index (u8 * name, u32 next_vector_index)
   hash_pair_t *hp;
 
   /* Must be called in the context of the main heap */
-  ASSERT (clib_mem_get_heap != sm->heap);
+  ASSERT (clib_mem_get_heap () != sm->heap);
 
   hp = hash_get_pair (sm->directory_vector_by_name, name);
   if (!hp)
     {
-      hash_set (sm->directory_vector_by_name, name, next_vector_index);
+      /* we allocate our private copy of 'name' */
+      hash_set (sm->directory_vector_by_name, format (0, "%s%c", name, 0),
+               next_vector_index);
       index = next_vector_index;
     }
   else
@@ -188,10 +190,6 @@ vlib_stats_register_error_index (void *oldheap, u8 * name, u64 * em_vec,
       shared_header->directory_offset =
        stat_segment_offset (shared_header, sm->directory_vector);
     }
-  else
-    {
-      vec_free (name);
-    }
 
   vlib_stat_segment_unlock ();
 }
@@ -449,13 +447,13 @@ update_node_counters (stat_segment_main_t * sm)
       vlib_stat_segment_lock ();
 
       stat_validate_counter_vector (&sm->directory_vector
-                                   [STAT_COUNTER_NODE_CLOCKS], l);
+                                   [STAT_COUNTER_NODE_CLOCKS], l - 1);
       stat_validate_counter_vector (&sm->directory_vector
-                                   [STAT_COUNTER_NODE_VECTORS], l);
+                                   [STAT_COUNTER_NODE_VECTORS], l - 1);
       stat_validate_counter_vector (&sm->directory_vector
-                                   [STAT_COUNTER_NODE_CALLS], l);
+                                   [STAT_COUNTER_NODE_CALLS], l - 1);
       stat_validate_counter_vector (&sm->directory_vector
-                                   [STAT_COUNTER_NODE_SUSPENDS], l);
+                                   [STAT_COUNTER_NODE_SUSPENDS], l - 1);
 
       vec_validate (sm->nodes, l - 1);
       stat_segment_directory_entry_t *ep;
@@ -654,7 +652,7 @@ stats_socket_accept_ready (clib_file_t * uf)
   return 0;
 }
 
-static void
+static clib_error_t *
 stats_segment_socket_init (void)
 {
   stat_segment_main_t *sm = &stat_segment_main;
@@ -667,10 +665,7 @@ stats_segment_socket_init (void)
     CLIB_SOCKET_F_ALLOW_GROUP_WRITE | CLIB_SOCKET_F_PASSCRED;
 
   if ((error = clib_socket_init (s)))
-    {
-      clib_error_report (error);
-      return;
-    }
+    return error;
 
   clib_file_t template = { 0 };
   template.read_function = stats_socket_accept_ready;
@@ -679,6 +674,8 @@ stats_segment_socket_init (void)
   clib_file_add (&file_main, &template);
 
   sm->socket = s;
+
+  return 0;
 }
 
 static clib_error_t *
@@ -716,10 +713,11 @@ statseg_init (vlib_main_t * vm)
 {
   stat_segment_main_t *sm = &stat_segment_main;
 
-  if (sm->socket_name)
-    stats_segment_socket_init ();
-
-  return 0;
+  /* set default socket file name when statseg config stanza is empty. */
+  if (!vec_len (sm->socket_name))
+    sm->socket_name = format (0, "%s/%s", vlib_unix_get_runtime_dir (),
+                             STAT_SEGMENT_SOCKET_FILENAME);
+  return stats_segment_socket_init ();
 }
 
 /* *INDENT-OFF* */
@@ -782,12 +780,9 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input)
     {
       if (unformat (input, "socket-name %s", &sm->socket_name))
        ;
+      /* DEPRECATE: default (does nothing) */
       else if (unformat (input, "default"))
-       {
-         vec_reset_length (sm->socket_name);
-         sm->socket_name = format (sm->socket_name, "%s",
-                                   STAT_SEGMENT_SOCKET_FILE);
-       }
+       ;
       else if (unformat (input, "size %U",
                         unformat_memory_size, &sm->memory_size))
        ;
@@ -800,15 +795,12 @@ statseg_config (vlib_main_t * vm, unformat_input_t * input)
                                  format_unformat_error, input);
     }
 
-  /* set default socket file name when statseg config stanza is empty. */
-  if (!vec_len (sm->socket_name))
-    sm->socket_name = format (sm->socket_name, "%s",
-                             STAT_SEGMENT_SOCKET_FILE);
   /*
    * NULL-terminate socket name string
    * clib_socket_init()->socket_config() use C str*
    */
-  vec_terminate_c_string (sm->socket_name);
+  if (vec_len (sm->socket_name))
+    vec_terminate_c_string (sm->socket_name);
 
   return 0;
 }