aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam/varsup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/transam/varsup.c')
-rw-r--r--src/backend/access/transam/varsup.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 857f2c3d3e8..a1144a2a79d 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -6,7 +6,7 @@
* Copyright (c) 2000, PostgreSQL Global Development Group
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.42 2001/07/16 22:43:33 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/transam/varsup.c,v 1.43 2001/08/10 18:57:33 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -105,11 +105,26 @@ ReadNewTransactionId(TransactionId *xid)
static Oid lastSeenOid = InvalidOid;
-void
-GetNewObjectId(Oid *oid_return)
+Oid
+GetNewObjectId(void)
{
+ Oid result;
+
SpinAcquire(OidGenLockId);
+ /*
+ * Check for wraparound of the OID counter. We *must* not return 0
+ * (InvalidOid); and as long as we have to check that, it seems a good
+ * idea to skip over everything below BootstrapObjectIdData too. (This
+ * basically just reduces the odds of OID collision right after a wrap
+ * occurs.) Note we are relying on unsigned comparison here.
+ */
+ if (ShmemVariableCache->nextOid < ((Oid) BootstrapObjectIdData))
+ {
+ ShmemVariableCache->nextOid = BootstrapObjectIdData;
+ ShmemVariableCache->oidCount = 0;
+ }
+
/* If we run out of logged for use oids then we must log more */
if (ShmemVariableCache->oidCount == 0)
{
@@ -117,13 +132,16 @@ GetNewObjectId(Oid *oid_return)
ShmemVariableCache->oidCount = VAR_OID_PREFETCH;
}
- if (PointerIsValid(oid_return))
- lastSeenOid = (*oid_return) = ShmemVariableCache->nextOid;
+ result = ShmemVariableCache->nextOid;
(ShmemVariableCache->nextOid)++;
(ShmemVariableCache->oidCount)--;
SpinRelease(OidGenLockId);
+
+ lastSeenOid = result;
+
+ return result;
}
void
@@ -159,8 +177,8 @@ CheckMaxObjectId(Oid assigned_oid)
*/
XLogPutNextOid(assigned_oid + VAR_OID_PREFETCH);
- ShmemVariableCache->oidCount = VAR_OID_PREFETCH - 1;
ShmemVariableCache->nextOid = assigned_oid + 1;
+ ShmemVariableCache->oidCount = VAR_OID_PREFETCH - 1;
SpinRelease(OidGenLockId);
}