summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2000-05-21 02:23:30 +0000
committerTom Lane2000-05-21 02:23:30 +0000
commitaa1617911836bd8f500320a365d59920fca2613b (patch)
treeaad6018f3a1cf8b07ff4b06ca00fef3a35c4e1f6
parent25a7a7f4469f3c861fbbe72733560dba71ae8ea7 (diff)
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.
-rw-r--r--src/backend/tcop/postgres.c9
-rw-r--r--src/backend/utils/mmgr/aset.c40
-rw-r--r--src/backend/utils/mmgr/mcxt.c25
-rw-r--r--src/include/utils/mcxt.h3
-rw-r--r--src/include/utils/memutils.h3
5 files changed, 71 insertions, 9 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index b6c69356130..683f057f212 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* 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
* 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)
{
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");
PS_SET_STATUS("commit");
CommitTransactionCommand();
+#ifdef SHOW_MEMORY_STATS
+ /* print global-context stats at each commit for leak tracking */
+ if (ShowStats)
+ GlobalMemoryStats();
+#endif
}
else
{
diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c
index 4bc96c5a2aa..574b98697d2 100644
--- a/src/backend/utils/mmgr/aset.c
+++ b/src/backend/utils/mmgr/aset.c
@@ -8,7 +8,7 @@
*
*
* 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:
* 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");
}
+
+/*
+ * 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);
+}
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index 29af5ce8e2a..5a3be6700e6 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -8,7 +8,7 @@
*
*
* 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))
printf("\tsucessor=%s\n", GlobalMemoryGetName(context));
- AllocSetDump(&this->setData); /* XXX is this right interface */
+ AllocSetDump(&this->setData);
}
/*
@@ -511,9 +511,26 @@ DumpGlobalMemories()
{
GlobalMemoryDump(context);
- context = (GlobalMemory) OrderedElemGetSuccessor(
- &context->elemData);
+ context = (GlobalMemory) OrderedElemGetSuccessor(&context->elemData);
}
}
#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);
+ }
+}
diff --git a/src/include/utils/mcxt.h b/src/include/utils/mcxt.h
index 2f7ae1cf5d3..7b867d86649 100644
--- a/src/include/utils/mcxt.h
+++ b/src/include/utils/mcxt.h
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* 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 GlobalMemory CreateGlobalMemory(char *name);
extern void GlobalMemoryDestroy(GlobalMemory context);
+extern void GlobalMemoryStats(void);
#endif /* MCXT_H */
diff --git a/src/include/utils/memutils.h b/src/include/utils/memutils.h
index a42bce402cd..3e6ad2e53da 100644
--- a/src/include/utils/memutils.h
+++ b/src/include/utils/memutils.h
@@ -13,7 +13,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* 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);
extern void AllocSetDump(AllocSet set);
+extern void AllocSetStats(AllocSet set, const char *ident);
#endif /* MEMUTILS_H */