Commit acd1536d authored by Bruce Momjian's avatar Bruce Momjian

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
parent 752a4dac
......@@ -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();
......
......@@ -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;
}
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment