forked from Mirror/frr
lib: clean/restore memory debugging functions
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>
This commit is contained in:
parent
4a1ab8e405
commit
7a13c923af
35
lib/memory.c
35
lib/memory.c
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -35,80 +35,6 @@
|
|||
#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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue