]> granicus.if.org Git - postgresql/commitdiff
Up to now, SerializableSnapshot and QuerySnapshot are malloc'ed and
authorBruce Momjian <bruce@momjian.us>
Thu, 12 Jun 2003 01:42:21 +0000 (01:42 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 12 Jun 2003 01:42:21 +0000 (01:42 +0000)
free'd for every transaction or statement, respectively.  This patch
puts these data structures into static memory, thus saving a few CPU
cycles and two malloc calls per transaction or (in isolation level
READ COMMITTED) per query.

Manfred Koizar

src/backend/storage/ipc/sinval.c
src/backend/utils/time/tqual.c
src/include/utils/tqual.h

index 2d9405b1fee780b365803601a5f87d0af1bc5166..8b6e94c4f1091e22a6220ec3663fa14b24a5ba9d 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.55 2003/05/27 17:49:46 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.56 2003/06/12 01:42:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -305,9 +305,8 @@ GetOldestXmin(bool allDbs)
  *----------
  */
 Snapshot
-GetSnapshotData(bool serializable)
+GetSnapshotData(Snapshot snapshot, bool serializable)
 {
-       Snapshot        snapshot = (Snapshot) malloc(sizeof(SnapshotData));
        SISeg      *segP = shmInvalBuffer;
        ProcState  *stateP = segP->procState;
        TransactionId xmin;
@@ -316,18 +315,29 @@ GetSnapshotData(bool serializable)
        int                     index;
        int                     count = 0;
 
-       if (snapshot == NULL)
-               elog(ERROR, "Memory exhausted in GetSnapshotData");
+       Assert(snapshot != NULL);
 
        /*
         * Allocating space for MaxBackends xids is usually overkill;
         * lastBackend would be sufficient.  But it seems better to do the
         * malloc while not holding the lock, so we can't look at lastBackend.
+        *
+        * if (snapshot->xip != NULL)
+        *     no need to free and reallocate xip;
+        *
+        * We can reuse the old xip array, because MaxBackends does not change
+        * at runtime.
         */
-       snapshot->xip = (TransactionId *)
-               malloc(MaxBackends * sizeof(TransactionId));
        if (snapshot->xip == NULL)
-               elog(ERROR, "Memory exhausted in GetSnapshotData");
+       {
+               /*
+                * First call for this snapshot
+                */
+               snapshot->xip = (TransactionId *)
+                       malloc(MaxBackends * sizeof(TransactionId));
+               if (snapshot->xip == NULL)
+                       elog(ERROR, "Memory exhausted in GetSnapshotData");
+       }
 
        globalxmin = xmin = GetCurrentTransactionId();
 
index f5f0305e91ab072c387aa8aa40475c29505f76ec..098ddbaea71ec0560ff0eff52e71b5e8f7aec0df 100644 (file)
@@ -16,7 +16,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.62 2003/02/23 23:20:52 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.63 2003/06/12 01:42:20 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,6 +30,8 @@
 static SnapshotData SnapshotDirtyData;
 Snapshot       SnapshotDirty = &SnapshotDirtyData;
 
+static SnapshotData QuerySnapshotData;
+static SnapshotData SerializableSnapshotData;
 Snapshot       QuerySnapshot = NULL;
 Snapshot       SerializableSnapshot = NULL;
 
@@ -941,23 +943,16 @@ SetQuerySnapshot(void)
        /* 1st call in xaction? */
        if (SerializableSnapshot == NULL)
        {
-               SerializableSnapshot = GetSnapshotData(true);
+               SerializableSnapshot = GetSnapshotData(&SerializableSnapshotData, true);
                QuerySnapshot = SerializableSnapshot;
                Assert(QuerySnapshot != NULL);
                return;
        }
 
-       if (QuerySnapshot != SerializableSnapshot)
-       {
-               free(QuerySnapshot->xip);
-               free(QuerySnapshot);
-               QuerySnapshot = NULL;
-       }
-
        if (XactIsoLevel == XACT_SERIALIZABLE)
                QuerySnapshot = SerializableSnapshot;
        else
-               QuerySnapshot = GetSnapshotData(false);
+               QuerySnapshot = GetSnapshotData(&QuerySnapshotData, false);
 
        Assert(QuerySnapshot != NULL);
 }
@@ -1003,19 +998,11 @@ CopyQuerySnapshot(void)
 void
 FreeXactSnapshot(void)
 {
-       if (QuerySnapshot != NULL && QuerySnapshot != SerializableSnapshot)
-       {
-               free(QuerySnapshot->xip);
-               free(QuerySnapshot);
-       }
-
+       /*
+        * We do not free(QuerySnapshot->xip);
+        *        or free(SerializableSnapshot->xip);
+        * they will be reused soon
+        */
        QuerySnapshot = NULL;
-
-       if (SerializableSnapshot != NULL)
-       {
-               free(SerializableSnapshot->xip);
-               free(SerializableSnapshot);
-       }
-
        SerializableSnapshot = NULL;
 }
index bba4eac14ced96e410c4cda3f409c104bfc0775c..15966dc04e78086f4af96a0d6c1d44a3d795d04a 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: tqual.h,v 1.44 2003/02/23 23:20:52 tgl Exp $
+ * $Id: tqual.h,v 1.45 2003/06/12 01:42:21 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -113,7 +113,7 @@ extern int HeapTupleSatisfiesUpdate(HeapTuple tuple,
 extern HTSV_Result HeapTupleSatisfiesVacuum(HeapTupleHeader tuple,
                                                 TransactionId OldestXmin);
 
-extern Snapshot GetSnapshotData(bool serializable);
+extern Snapshot GetSnapshotData(Snapshot snapshot, bool serializable);
 extern void SetQuerySnapshot(void);
 extern Snapshot CopyQuerySnapshot(void);
 extern void FreeXactSnapshot(void);