From 805ee87b7d90fe6ba61585967cdf785edfde8d45 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 9 Sep 1999 16:29:22 +0000 Subject: [PATCH] Repair incorrect cleanup of heap memory allocation during transaction abort --- before it only worked if there was exactly one level of allocation context stacked in the blank portal. Now it does the right thing for any depth, including zero... --- src/backend/access/transam/xact.c | 22 +++++----------------- src/backend/utils/mmgr/portalmem.c | 5 ++--- src/include/utils/portal.h | 3 ++- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 7eb40c9ab9c..a4e7348c538 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.42.2.2 1999/08/08 20:24:12 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.42.2.3 1999/09/09 16:29:22 tgl Exp $ * * NOTES * Transaction aborts can now occur two ways: @@ -693,19 +693,13 @@ static void AtCommit_Memory() { Portal portal; - MemoryContext portalContext; /* ---------------- - * Release memory in the blank portal. - * Since EndPortalAllocMode implicitly works on the current context, - * first make real sure that the blank portal is the selected context. - * (This is probably not necessary, but seems like a good idea...) + * Release all heap memory in the blank portal. * ---------------- */ portal = GetPortalByName(NULL); - portalContext = (MemoryContext) PortalGetHeapMemory(portal); - MemoryContextSwitchTo(portalContext); - EndPortalAllocMode(); + PortalResetHeapMemory(portal); /* ---------------- * Now that we're "out" of a transaction, have the @@ -782,19 +776,13 @@ static void AtAbort_Memory() { Portal portal; - MemoryContext portalContext; /* ---------------- - * Release memory in the blank portal. - * Since EndPortalAllocMode implicitly works on the current context, - * first make real sure that the blank portal is the selected context. - * (This is ESSENTIAL in case we aborted from someplace where it wasn't.) + * Release all heap memory in the blank portal. * ---------------- */ portal = GetPortalByName(NULL); - portalContext = (MemoryContext) PortalGetHeapMemory(portal); - MemoryContextSwitchTo(portalContext); - EndPortalAllocMode(); + PortalResetHeapMemory(portal); /* ---------------- * Now that we're "out" of a transaction, have the diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 89fd6dba69b..703a95b76af 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.23.2.1 1999/08/02 05:25:16 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.23.2.2 1999/09/09 16:29:16 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -83,7 +83,6 @@ static void CollectNamedPortals(Portal *portalP, int destroy); static Portal PortalHeapMemoryGetPortal(PortalHeapMemory context); static PortalVariableMemory PortalHeapMemoryGetVariableMemory(PortalHeapMemory context); -static void PortalResetHeapMemory(Portal portal); static Portal PortalVariableMemoryGetPortal(PortalVariableMemory context); /* ---------------- @@ -838,7 +837,7 @@ PortalDestroy(Portal *portalP) * BadArg if mode is invalid. * ---------------- */ -static void +void PortalResetHeapMemory(Portal portal) { PortalHeapMemory context; diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h index 6bf8e9d778b..7376bd95323 100644 --- a/src/include/utils/portal.h +++ b/src/include/utils/portal.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: portal.h,v 1.15.2.1 1999/08/02 05:25:26 scrappy Exp $ + * $Id: portal.h,v 1.15.2.2 1999/09/09 16:29:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -75,6 +75,7 @@ extern Portal CreatePortal(char *name); extern void PortalDestroy(Portal *portalP); extern void StartPortalAllocMode(AllocMode mode, Size limit); extern void EndPortalAllocMode(void); +extern void PortalResetHeapMemory(Portal portal); extern PortalVariableMemory PortalGetVariableMemory(Portal portal); extern PortalHeapMemory PortalGetHeapMemory(Portal portal); -- 2.39.5