]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: clean/restore memory debugging functions
authorDavid Lamparter <equinox@opensourcerouting.org>
Thu, 11 Feb 2016 16:12:44 +0000 (17:12 +0100)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Mon, 19 Sep 2016 20:31:08 +0000 (16:31 -0400)
This adapts the dump-at-exit handler and removes the old leftover code.

(Note the text in log_memtype_stderr was actually incorrect as the only
caller in bgpd cleans up configuration before calling it, i.e. any
remaining allocations are missing-cleanup bugs.)

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
Acked-by: Vincent JARDIN <vincent.jardin@6wind.com>
Acked-by: Donald Sharp <sharpd@cumulusnetworks.com>
lib/memory.c
lib/memory.h
lib/memory_vty.c
lib/memory_vty.h

index 562b0f589a3d79837e681c2279c6562503b310b3..38e424da7de760cca57ded985d028d184ebb4356 100644 (file)
@@ -112,3 +112,38 @@ qmem_walk (qmem_walk_fn *func, void *arg)
     }
   return 0;
 }
+
+struct exit_dump_args
+{
+  const char *prefix;
+  int error;
+};
+
+static int
+qmem_exit_walker (void *arg, struct memgroup *mg, struct memtype *mt)
+{
+  struct exit_dump_args *eda = arg;
+
+  if (!mt)
+    {
+      fprintf (stderr, "%s: showing active allocations in memory group %s\n",
+               eda->prefix, mg->name);
+    }
+  else if (mt->n_alloc)
+    {
+      char size[32];
+      eda->error++;
+      snprintf (size, sizeof (size), "%10zu", mt->size);
+      fprintf (stderr, "%s:  %-30s: %6zu * %s\n",
+               eda->prefix, mt->name, mt->n_alloc,
+               mt->size == SIZE_VAR ? "(variably sized)" : size);
+    }
+  return 0;
+}
+
+void
+log_memstats_stderr (const char *prefix)
+{
+  struct exit_dump_args eda = { .prefix = prefix, .error = 0 };
+  qmem_walk (qmem_exit_walker, &eda);
+}
index 2680253d98e86a71a72997112bad30386b832dec..8f7d85a98303ef3a3c724df6bc094df44f987a4f 100644 (file)
@@ -172,6 +172,7 @@ static inline size_t mtype_stats_alloc(struct memtype *mt)
  * last value from qmem_walk_fn. */
 typedef int qmem_walk_fn (void *arg, struct memgroup *mg, struct memtype *mt);
 extern int qmem_walk (qmem_walk_fn *func, void *arg);
+extern void log_memstats_stderr (const char *);
 
 extern void memory_oom (size_t size, const char *name);
 
index fa9f50a23a7e0029c07d0e670ccc620b2f4649d9..e4cb295cf0df62397ddac564cedb21866fa3cf16 100644 (file)
 #include "vty.h"
 #include "command.h"
 
-void
-log_memstats_stderr (const char *prefix)
-{
-#if 0
-  struct mlist *ml;
-  struct memory_list *m;
-  int i;
-  int j = 0;
-
-  for (ml = mlists; ml->list; ml++)
-    {
-      i = 0;
-
-      for (m = ml->list; m->index >= 0; m++)
-        if (m->index && mstat[m->index].alloc)
-          {
-            if (!i)
-              fprintf (stderr,
-                       "%s: memstats: Current memory utilization in module %s:\n",
-                       prefix,
-                       ml->name);
-            fprintf (stderr,
-                     "%s: memstats:  %-30s: %10ld%s\n",
-                     prefix,
-                     m->format,
-                     mstat[m->index].alloc,
-                     mstat[m->index].alloc < 0 ? " (REPORT THIS BUG!)" : "");
-            i = j = 1;
-          }
-    }
-
-  if (j)
-    fprintf (stderr,
-             "%s: memstats: NOTE: If configuration exists, utilization may be "
-             "expected.\n",
-             prefix);
-  else
-    fprintf (stderr,
-             "%s: memstats: No remaining tracked memory utilization.\n",
-             prefix);
-#endif
-}
-
-#if 0
-static void
-show_separator(struct vty *vty)
-{
-  vty_out (vty, "-----------------------------\r\n");
-}
-
-static int
-show_memory_vty (struct vty *vty, struct memory_list *list)
-{
-  struct memory_list *m;
-  int needsep = 0;
-
-  for (m = list; m->index >= 0; m++)
-    if (m->index == 0)
-      {
-       if (needsep)
-         {
-           show_separator (vty);
-           needsep = 0;
-         }
-      }
-    else if (mstat[m->index].alloc)
-      {
-       vty_out (vty, "%-30s: %10ld\r\n", m->format, mstat[m->index].alloc);
-       needsep = 1;
-      }
-  return needsep;
-}
-#endif
-
 #ifdef HAVE_MALLINFO
 static int
 show_memory_mallinfo (struct vty *vty)
@@ -174,23 +100,10 @@ DEFUN (show_memory,
        "Show running system information\n"
        "Memory statistics\n")
 {
-  int needsep = 0;
-  
 #ifdef HAVE_MALLINFO
-  needsep = show_memory_mallinfo (vty);
+  show_memory_mallinfo (vty);
 #endif /* HAVE_MALLINFO */
 
-  (void) needsep;
-#if 0
-  struct mlist *ml;
-  for (ml = mlists; ml->list; ml++)
-    {
-      if (needsep)
-       show_separator (vty);
-      needsep = show_memory_vty (vty, ml->list);
-    }
-#endif
-
   qmem_walk(qmem_walker, vty);
   return CMD_SUCCESS;
 }
index 7aab01ee5b1b5805b972f6347a569133d00f04c8..565a75aa9807b16c7523602a887e4c01b6b2d165 100644 (file)
@@ -24,7 +24,6 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include "memory.h"
 
 extern void memory_init (void);
-extern void log_memstats_stderr (const char *);
 
 /* Human friendly string for given byte count */
 #define MTYPE_MEMSTR_LEN 20