summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2003-06-12 01:42:21 +0000
committerBruce Momjian2003-06-12 01:42:21 +0000
commitacd1536d9f14df6a0fdb45e22ec317bc9b254c08 (patch)
tree619252b476460a968b98835ec9d78ec1e7bca277
parent752a4dac50a9a3e99eb60a5c6cedf8a962de6518 (diff)
Up to now, SerializableSnapshot and QuerySnapshot are malloc'ed and
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
-rw-r--r--src/backend/storage/ipc/sinval.c26
-rw-r--r--src/backend/utils/time/tqual.c33
-rw-r--r--src/include/utils/tqual.h4
3 files changed, 30 insertions, 33 deletions
diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c
index 2d9405b1fee..8b6e94c4f10 100644
--- a/src/backend/storage/ipc/sinval.c
+++ b/src/backend/storage/ipc/sinval.c
@@ -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();
diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c
index f5f0305e91a..098ddbaea71 100644
--- a/src/backend/utils/time/tqual.c
+++ b/src/backend/utils/time/tqual.c
@@ -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;
}
diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h
index bba4eac14ce..15966dc04e7 100644
--- a/src/include/utils/tqual.h
+++ b/src/include/utils/tqual.h
@@ -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);