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);