aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/mmgr/mcxt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/mmgr/mcxt.c')
-rw-r--r--src/backend/utils/mmgr/mcxt.c46
1 files changed, 22 insertions, 24 deletions
diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c
index 72a32abdddb..e2fbfd420b6 100644
--- a/src/backend/utils/mmgr/mcxt.c
+++ b/src/backend/utils/mmgr/mcxt.c
@@ -132,11 +132,8 @@ MemoryContextInit(void)
/*
* MemoryContextReset
- * Release all space allocated within a context and its descendants,
- * but don't delete the contexts themselves.
- *
- * The type-specific reset routine handles the context itself, but we
- * have to do the recursion for the children.
+ * Release all space allocated within a context and delete all its
+ * descendant contexts (but not the named context itself).
*/
void
MemoryContextReset(MemoryContext context)
@@ -145,7 +142,22 @@ MemoryContextReset(MemoryContext context)
/* save a function call in common case where there are no children */
if (context->firstchild != NULL)
- MemoryContextResetChildren(context);
+ MemoryContextDeleteChildren(context);
+
+ /* save a function call if no pallocs since startup or last reset */
+ if (!context->isReset)
+ MemoryContextResetOnly(context);
+}
+
+/*
+ * MemoryContextResetOnly
+ * Release all space allocated within a context.
+ * Nothing is done to the context's descendant contexts.
+ */
+void
+MemoryContextResetOnly(MemoryContext context)
+{
+ AssertArg(MemoryContextIsValid(context));
/* Nothing to do if no pallocs since startup or last reset */
if (!context->isReset)
@@ -172,7 +184,10 @@ MemoryContextResetChildren(MemoryContext context)
AssertArg(MemoryContextIsValid(context));
for (child = context->firstchild; child != NULL; child = child->nextchild)
- MemoryContextReset(child);
+ {
+ MemoryContextResetChildren(child);
+ MemoryContextResetOnly(child);
+ }
}
/*
@@ -235,23 +250,6 @@ MemoryContextDeleteChildren(MemoryContext context)
}
/*
- * MemoryContextResetAndDeleteChildren
- * Release all space allocated within a context and delete all
- * its descendants.
- *
- * This is a common combination case where we want to preserve the
- * specific context but get rid of absolutely everything under it.
- */
-void
-MemoryContextResetAndDeleteChildren(MemoryContext context)
-{
- AssertArg(MemoryContextIsValid(context));
-
- MemoryContextDeleteChildren(context);
- MemoryContextReset(context);
-}
-
-/*
* MemoryContextRegisterResetCallback
* Register a function to be called before next context reset/delete.
* Such callbacks will be called in reverse order of registration.