STATS: Dynamically mapped shared memory segment
[vpp.git] / src / vpp / app / vpp_get_stats.c
index 908e675..c1a5acb 100644 (file)
 #include <vpp/stats/stats.h>
 
 static int
-stat_poll_loop (stat_segment_cached_pointer_t * cp)
+stat_poll_loop (u8 ** patterns)
 {
   struct timespec ts, tsrem;
   stat_segment_data_t *res;
   int i, j, k, lost_connection = 0;
   f64 heartbeat, prev_heartbeat = 0;
+  u32 *stats = stat_segment_ls (patterns);
+  if (!stats)
+    {
+      return -1;
+    }
 
   printf ("\033[2J");          /*  clear the screen  */
   while (1)
@@ -49,7 +54,12 @@ stat_poll_loop (stat_segment_cached_pointer_t * cp)
        }
 
       printf ("\033[H");       /* Cursor top left corner */
-      res = stat_segment_collect (cp);
+      res = stat_segment_dump (stats);
+      if (!res)
+       {
+         stats = stat_segment_ls (patterns);
+         continue;
+       }
       for (i = 0; i < vec_len (res); i++)
        {
          switch (res[i].type)
@@ -57,24 +67,24 @@ stat_poll_loop (stat_segment_cached_pointer_t * cp)
            case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
              for (k = 0; k < vec_len (res[i].simple_counter_vec); k++)
                for (j = 0; j < vec_len (res[i].simple_counter_vec[k]); j++)
-                 fformat (stdout, "[%d]: %lld packets %s\n",
+                 fformat (stdout, "[%d]: %llu packets %s\n",
                           j, res[i].simple_counter_vec[k][j], res[i].name);
              break;
 
            case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
              for (k = 0; k < vec_len (res[i].simple_counter_vec); k++)
                for (j = 0; j < vec_len (res[i].combined_counter_vec[k]); j++)
-                 fformat (stdout, "[%d]: %lld packets, %lld bytes %s\n",
+                 fformat (stdout, "[%d]: %llu packets, %llu bytes %s\n",
                           j, res[i].combined_counter_vec[k][j].packets,
                           res[i].combined_counter_vec[k][j].bytes,
                           res[i].name);
              break;
 
            case STAT_DIR_TYPE_ERROR_INDEX:
-             fformat (stdout, "%lld %s\n", res[i].error_value, res[i].name);
+             fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name);
              break;
 
-           case STAT_DIR_TYPE_SCALAR_POINTER:
+           case STAT_DIR_TYPE_SCALAR_INDEX:
              fformat (stdout, "%.2f %s\n", res[i].scalar_value, res[i].name);
              break;
 
@@ -99,6 +109,7 @@ enum stat_client_cmd_e
   STAT_CLIENT_CMD_LS,
   STAT_CLIENT_CMD_POLL,
   STAT_CLIENT_CMD_DUMP,
+  STAT_CLIENT_CMD_TIGHTPOLL,
 };
 
 int
@@ -108,10 +119,9 @@ main (int argc, char **argv)
   u8 *stat_segment_name, *pattern = 0, **patterns = 0;
   int rv;
   enum stat_client_cmd_e cmd = STAT_CLIENT_CMD_UNKNOWN;
-  void *heap_base;
 
-  heap_base = clib_mem_vm_map ((void *) 0x10000000ULL, 128 << 20);
-  clib_mem_init (heap_base, 128 << 20);
+  /* Create a heap of 64MB */
+  clib_mem_init (0, 64 << 20);
 
   unformat_init_command_line (a, argv);
 
@@ -133,6 +143,10 @@ main (int argc, char **argv)
        {
          cmd = STAT_CLIENT_CMD_POLL;
        }
+      else if (unformat (a, "tightpoll"))
+       {
+         cmd = STAT_CLIENT_CMD_TIGHTPOLL;
+       }
       else if (unformat (a, "%s", &pattern))
        {
          vec_add1 (patterns, pattern);
@@ -154,10 +168,9 @@ reconnect:
       exit (1);
     }
 
-  u8 **dir;
+  u32 *dir;
   int i, j, k;
   stat_segment_data_t *res;
-  stat_segment_cached_pointer_t *cp;
 
   dir = stat_segment_ls (patterns);
 
@@ -167,7 +180,9 @@ reconnect:
       /* List all counters */
       for (i = 0; i < vec_len (dir); i++)
        {
-         printf ("%s\n", (char *) dir[i]);
+         char *n = stat_segment_index_to_name (dir[i]);
+         printf ("%s\n", n);
+         free (n);
        }
       break;
 
@@ -180,7 +195,7 @@ reconnect:
            case STAT_DIR_TYPE_COUNTER_VECTOR_SIMPLE:
              for (k = 0; k < vec_len (res[i].simple_counter_vec) - 1; k++)
                for (j = 0; j < vec_len (res[i].simple_counter_vec[k]); j++)
-                 fformat (stdout, "[%d @ %d]: %lld packets %s\n",
+                 fformat (stdout, "[%d @ %d]: %llu packets %s\n",
                           j, k, res[i].simple_counter_vec[k][j],
                           res[i].name);
              break;
@@ -188,19 +203,18 @@ reconnect:
            case STAT_DIR_TYPE_COUNTER_VECTOR_COMBINED:
              for (k = 0; k < vec_len (res[i].combined_counter_vec); k++)
                for (j = 0; j < vec_len (res[i].combined_counter_vec[k]); j++)
-                 fformat (stdout, "[%d @ %d]: %lld packets, %lld bytes %s\n",
+                 fformat (stdout, "[%d @ %d]: %llu packets, %llu bytes %s\n",
                           j, k, res[i].combined_counter_vec[k][j].packets,
                           res[i].combined_counter_vec[k][j].bytes,
                           res[i].name);
              break;
 
            case STAT_DIR_TYPE_ERROR_INDEX:
-             fformat (stdout, "%lld %s\n", res[i].error_value, dir[i]);
+             fformat (stdout, "%llu %s\n", res[i].error_value, res[i].name);
              break;
 
-           case STAT_DIR_TYPE_SCALAR_POINTER:
-             fformat (stdout, "%.2f %s\n", dir[i], res[i].scalar_value,
-                      res[i].name);
+           case STAT_DIR_TYPE_SCALAR_INDEX:
+             fformat (stdout, "%.2f %s\n", res[i].scalar_value, res[i].name);
              break;
 
            default:
@@ -211,19 +225,27 @@ reconnect:
       break;
 
     case STAT_CLIENT_CMD_POLL:
-      cp = stat_segment_register (dir);
-      if (!cp)
-       {
-         fformat (stderr,
-                  "Couldn't register required counters with stat segment\n");
-         exit (1);
-       }
-      stat_poll_loop (cp);
+      stat_poll_loop (patterns);
       /* We can only exist the pool loop if we lost connection to VPP */
       stat_segment_disconnect ();
       goto reconnect;
       break;
 
+    case STAT_CLIENT_CMD_TIGHTPOLL:
+      while (1)
+       {
+         res = stat_segment_dump (dir);
+         if (res == 0)
+           {
+             /* Refresh */
+             vec_free (dir);
+             dir = stat_segment_ls (patterns);
+             continue;
+           }
+         stat_segment_data_free (res);
+       }
+      break;
+
     default:
       fformat (stderr,
               "%s: usage [socket-name <name>] [ls|dump|poll] <patterns> ...\n",