OSDN Git Service

Repair incorrect cleanup of heap memory allocation during
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 9 Sep 1999 16:25:35 +0000 (16:25 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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 c9e16da..b6e19d6 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 a49dca4..d625d25 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 cfaea91..c299f9a 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);