Add debug code to aid in memory-leak tracking: if SHOW_MEMORY_STATS is

defined then statistics about memory usage of all the global memory
contexts are printed after each commit.
This commit is contained in:
Tom Lane 2000-05-21 02:23:30 +00:00
parent 25a7a7f446
commit aa16179118
5 changed files with 71 additions and 9 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.154 2000/04/30 21:29:23 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.155 2000/05/21 02:23:30 tgl Exp $
* *
* NOTES * NOTES
* this is the "main" module of the postgres backend and * this is the "main" module of the postgres backend and
@ -1452,7 +1452,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
if (!IsUnderPostmaster) if (!IsUnderPostmaster)
{ {
puts("\nPOSTGRES backend interactive interface "); puts("\nPOSTGRES backend interactive interface ");
puts("$Revision: 1.154 $ $Date: 2000/04/30 21:29:23 $\n"); puts("$Revision: 1.155 $ $Date: 2000/05/21 02:23:30 $\n");
} }
/* /*
@ -1631,6 +1631,11 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
TPRINTF(TRACE_VERBOSE, "CommitTransactionCommand"); TPRINTF(TRACE_VERBOSE, "CommitTransactionCommand");
PS_SET_STATUS("commit"); PS_SET_STATUS("commit");
CommitTransactionCommand(); CommitTransactionCommand();
#ifdef SHOW_MEMORY_STATS
/* print global-context stats at each commit for leak tracking */
if (ShowStats)
GlobalMemoryStats();
#endif
} }
else else
{ {

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/mmgr/aset.c,v 1.26 2000/04/12 17:16:09 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/aset.c,v 1.27 2000/05/21 02:23:29 tgl Exp $
* *
* NOTE: * NOTE:
* This is a new (Feb. 05, 1999) implementation of the allocation set * This is a new (Feb. 05, 1999) implementation of the allocation set
@ -541,3 +541,41 @@ AllocSetDump(AllocSet set)
{ {
elog(DEBUG, "Currently unable to dump AllocSet"); elog(DEBUG, "Currently unable to dump AllocSet");
} }
/*
* AllocSetStats
* Displays stats about memory consumption of an allocset.
*/
void
AllocSetStats(AllocSet set, const char *ident)
{
long nblocks = 0;
long nchunks = 0;
long totalspace = 0;
long freespace = 0;
AllocBlock block;
AllocChunk chunk;
int fidx;
AssertArg(AllocSetIsValid(set));
for (block = set->blocks; block != NULL; block = block->next)
{
nblocks++;
totalspace += block->endptr - ((char *) block);
freespace += block->endptr - block->freeptr;
}
for (fidx = 0; fidx < ALLOCSET_NUM_FREELISTS; fidx++)
{
for (chunk = set->freelist[fidx]; chunk != NULL;
chunk = (AllocChunk) chunk->aset)
{
nchunks++;
freespace += chunk->size + ALLOC_CHUNKHDRSZ;
}
}
fprintf(stderr,
"%s: %ld total in %ld blocks; %ld free (%ld chunks); %ld used\n",
ident, totalspace, nblocks, freespace, nchunks,
totalspace - freespace);
}

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/mmgr/mcxt.c,v 1.20 2000/01/26 05:57:30 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/mcxt.c,v 1.21 2000/05/21 02:23:29 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -489,7 +489,7 @@ GlobalMemoryDump(GlobalMemory this)
if (PointerIsValid(context)) if (PointerIsValid(context))
printf("\tsucessor=%s\n", GlobalMemoryGetName(context)); printf("\tsucessor=%s\n", GlobalMemoryGetName(context));
AllocSetDump(&this->setData); /* XXX is this right interface */ AllocSetDump(&this->setData);
} }
/* /*
@ -511,9 +511,26 @@ DumpGlobalMemories()
{ {
GlobalMemoryDump(context); GlobalMemoryDump(context);
context = (GlobalMemory) OrderedElemGetSuccessor( context = (GlobalMemory) OrderedElemGetSuccessor(&context->elemData);
&context->elemData);
} }
} }
#endif #endif
/*
* GlobalMemoryStats
* Displays stats about memory consumption of all global contexts.
*/
void
GlobalMemoryStats(void)
{
GlobalMemory context;
context = (GlobalMemory) OrderedSetGetHead(&ActiveGlobalMemorySetData);
while (PointerIsValid(context))
{
AllocSetStats(&context->setData, GlobalMemoryGetName(context));
context = (GlobalMemory) OrderedElemGetSuccessor(&context->elemData);
}
}

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: mcxt.h,v 1.16 2000/01/26 05:58:38 momjian Exp $ * $Id: mcxt.h,v 1.17 2000/05/21 02:23:28 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -54,6 +54,7 @@ extern void MemoryContextFree(MemoryContext context, Pointer pointer);
extern MemoryContext MemoryContextSwitchTo(MemoryContext context); extern MemoryContext MemoryContextSwitchTo(MemoryContext context);
extern GlobalMemory CreateGlobalMemory(char *name); extern GlobalMemory CreateGlobalMemory(char *name);
extern void GlobalMemoryDestroy(GlobalMemory context); extern void GlobalMemoryDestroy(GlobalMemory context);
extern void GlobalMemoryStats(void);
#endif /* MCXT_H */ #endif /* MCXT_H */

View File

@ -13,7 +13,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: memutils.h,v 1.34 2000/04/12 17:16:55 momjian Exp $ * $Id: memutils.h,v 1.35 2000/05/21 02:23:28 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -224,6 +224,7 @@ extern AllocPointer AllocSetRealloc(AllocSet set, AllocPointer pointer,
Size size); Size size);
extern void AllocSetDump(AllocSet set); extern void AllocSetDump(AllocSet set);
extern void AllocSetStats(AllocSet set, const char *ident);
#endif /* MEMUTILS_H */ #endif /* MEMUTILS_H */