Repair incorrect cleanup of heap memory allocation during
authorTom Lane
Thu, 9 Sep 1999 16:25:35 +0000 (16:25 +0000)
committerTom Lane
Thu, 9 Sep 1999 16:25:35 +0000 (16:25 +0000)
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
src/backend/utils/mmgr/portalmem.c
src/include/utils/portal.h

index c9e16daa0d74fb12945cff5dcb20bf71861cfcd2..b6e19d614e2a265d5fa490f6485cf71e7ed9f5e5 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.50 1999/09/05 17:12:34 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/access/transam/xact.c,v 1.51 1999/09/09 16:25:35 tgl Exp $
  *
  * NOTES
  *     Transaction aborts can now occur two ways:
@@ -694,19 +694,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
@@ -784,19 +778,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
index a49dca40b6a437be3a192361122530e447737d8a..d625d25d5bdd13548c52189b69881d7875022d6d 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.28 1999/07/17 20:18:15 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.29 1999/09/09 16:25:29 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;
index cfaea911a52f5d8003c3a1db28737c289fc8bdd1..c299f9a6d53d434d655da753c2124959da48457e 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: portal.h,v 1.17 1999/07/15 23:04:23 momjian Exp $
+ * $Id: portal.h,v 1.18 1999/09/09 16:25:23 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);