Adjust the output of MemoryContextStats() so that the stats for a
authorNeil Conway <neilc@samurai.com>
Tue, 7 Aug 2007 06:25:14 +0000 (06:25 +0000)
committerNeil Conway <neilc@samurai.com>
Tue, 7 Aug 2007 06:25:14 +0000 (06:25 +0000)
child memory contexts is indented two spaces to the right of its
parent context.  This should make it easier to deduce the memory
context hierarchy from the output of MemoryContextStats().

src/backend/utils/mmgr/aset.c
src/backend/utils/mmgr/mcxt.c
src/include/nodes/memnodes.h

index 6c4f84a810532824a10705b26f33d55dacc98a09..81dbe75f3fc0a416105953eb1d92e4577d8cfb75 100644 (file)
@@ -214,7 +214,7 @@ static void AllocSetReset(MemoryContext context);
 static void AllocSetDelete(MemoryContext context);
 static Size AllocSetGetChunkSpace(MemoryContext context, void *pointer);
 static bool AllocSetIsEmpty(MemoryContext context);
-static void AllocSetStats(MemoryContext context);
+static void AllocSetStats(MemoryContext context, int level);
 
 #ifdef MEMORY_CONTEXT_CHECKING
 static void AllocSetCheck(MemoryContext context);
@@ -1034,7 +1034,7 @@ AllocSetIsEmpty(MemoryContext context)
  *             Displays stats about memory consumption of an allocset.
  */
 static void
-AllocSetStats(MemoryContext context)
+AllocSetStats(MemoryContext context, int level)
 {
        AllocSet        set = (AllocSet) context;
        long            nblocks = 0;
@@ -1044,6 +1044,7 @@ AllocSetStats(MemoryContext context)
        AllocBlock      block;
        AllocChunk      chunk;
        int                     fidx;
+       int                     i;
 
        for (block = set->blocks; block != NULL; block = block->next)
        {
@@ -1060,6 +1061,10 @@ AllocSetStats(MemoryContext context)
                        freespace += chunk->size + ALLOC_CHUNKHDRSZ;
                }
        }
+
+       for (i = 0; i < level; i++)
+               fprintf(stderr, "  ");
+
        fprintf(stderr,
                        "%s: %lu total in %ld blocks; %lu free (%ld chunks); %lu used\n",
                        set->header.name, totalspace, nblocks, freespace, nchunks,
index d392376970f3f594f57b188104efe306b2899cf2..8c49df15ab3466d7d710371b1bad2aa01a0cfe1e 100644 (file)
@@ -49,6 +49,8 @@ MemoryContext CurTransactionContext = NULL;
 /* This is a transient link to the active portal's memory context: */
 MemoryContext PortalContext = NULL;
 
+static void MemoryContextStatsInternal(MemoryContext context, int level);
+
 
 /*****************************************************************************
  *       EXPORTED ROUTINES                                                                                                              *
@@ -320,17 +322,22 @@ MemoryContextIsEmpty(MemoryContext context)
  */
 void
 MemoryContextStats(MemoryContext context)
+{
+       MemoryContextStatsInternal(context, 0);
+}
+
+static void
+MemoryContextStatsInternal(MemoryContext context, int level)
 {
        MemoryContext child;
 
        AssertArg(MemoryContextIsValid(context));
 
-       (*context->methods->stats) (context);
+       (*context->methods->stats) (context, level);
        for (child = context->firstchild; child != NULL; child = child->nextchild)
-               MemoryContextStats(child);
+               MemoryContextStatsInternal(child, level + 1);
 }
 
-
 /*
  * MemoryContextCheck
  *             Check all chunks in the named context.
index 7db193f8b589eb7dde98c199a4f3aab271fc11c8..13fac47edb722417849570e3b12e14035bffd253 100644 (file)
@@ -44,7 +44,7 @@ typedef struct MemoryContextMethods
        void            (*delete) (MemoryContext context);
        Size            (*get_chunk_space) (MemoryContext context, void *pointer);
        bool            (*is_empty) (MemoryContext context);
-       void            (*stats) (MemoryContext context);
+       void            (*stats) (MemoryContext context, int level);
 #ifdef MEMORY_CONTEXT_CHECKING
        void            (*check) (MemoryContext context);
 #endif