aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/lmgr/lmgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/storage/lmgr/lmgr.c')
-rw-r--r--src/backend/storage/lmgr/lmgr.c72
1 files changed, 24 insertions, 48 deletions
diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c
index 6105a3248ce..659c3381e0a 100644
--- a/src/backend/storage/lmgr/lmgr.c
+++ b/src/backend/storage/lmgr/lmgr.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.50 2001/08/25 18:52:42 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.51 2001/09/27 16:29:12 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -145,9 +145,6 @@ LockRelation(Relation relation, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relation->rd_lockInfo.lockRelId.relId;
tag.dbId = relation->rd_lockInfo.lockRelId.dbId;
@@ -182,9 +179,6 @@ ConditionalLockRelation(Relation relation, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return true;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relation->rd_lockInfo.lockRelId.relId;
tag.dbId = relation->rd_lockInfo.lockRelId.dbId;
@@ -215,9 +209,6 @@ UnlockRelation(Relation relation, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relation->rd_lockInfo.lockRelId.relId;
tag.dbId = relation->rd_lockInfo.lockRelId.dbId;
@@ -243,9 +234,6 @@ LockRelationForSession(LockRelId *relid, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relid->relId;
tag.dbId = relid->dbId;
@@ -264,9 +252,6 @@ UnlockRelationForSession(LockRelId *relid, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relid->relId;
tag.dbId = relid->dbId;
@@ -277,15 +262,16 @@ UnlockRelationForSession(LockRelId *relid, LOCKMODE lockmode)
/*
* LockPage
+ *
+ * Obtain a page-level lock. This is currently used by some index access
+ * methods to lock index pages. For heap relations, it is used only with
+ * blkno == 0 to signify locking the relation for extension.
*/
void
LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relation->rd_lockInfo.lockRelId.relId;
tag.dbId = relation->rd_lockInfo.lockRelId.dbId;
@@ -304,9 +290,6 @@ UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = relation->rd_lockInfo.lockRelId.relId;
tag.dbId = relation->rd_lockInfo.lockRelId.dbId;
@@ -315,14 +298,21 @@ UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
LockRelease(LockTableId, &tag, GetCurrentTransactionId(), lockmode);
}
+/*
+ * XactLockTableInsert
+ *
+ * Insert a lock showing that the given transaction ID is running ---
+ * this is done during xact startup. The lock can then be used to wait
+ * for the transaction to finish.
+ *
+ * We need no corresponding unlock function, since the lock will always
+ * be released implicitly at transaction commit/abort, never any other way.
+ */
void
XactLockTableInsert(TransactionId xid)
{
LOCKTAG tag;
- if (LockingDisabled())
- return;
-
MemSet(&tag, 0, sizeof(tag));
tag.relId = XactLockTableId;
tag.dbId = InvalidOid; /* xids are globally unique */
@@ -333,43 +323,29 @@ XactLockTableInsert(TransactionId xid)
elog(ERROR, "XactLockTableInsert: LockAcquire failed");
}
-#ifdef NOT_USED
-void
-XactLockTableDelete(TransactionId xid)
-{
- LOCKTAG tag;
-
- if (LockingDisabled())
- return;
-
- MemSet(&tag, 0, sizeof(tag));
- tag.relId = XactLockTableId;
- tag.dbId = InvalidOid;
- tag.objId.xid = xid;
-
- LockRelease(LockTableId, &tag, xid, ExclusiveLock);
-}
-
-#endif
-
+/*
+ * XactLockTableWait
+ *
+ * Wait for the specified transaction to commit or abort.
+ */
void
XactLockTableWait(TransactionId xid)
{
LOCKTAG tag;
+ TransactionId myxid = GetCurrentTransactionId();
- if (LockingDisabled())
- return;
+ Assert(! TransactionIdEquals(xid, myxid));
MemSet(&tag, 0, sizeof(tag));
tag.relId = XactLockTableId;
tag.dbId = InvalidOid;
tag.objId.xid = xid;
- if (!LockAcquire(LockTableId, &tag, GetCurrentTransactionId(),
+ if (!LockAcquire(LockTableId, &tag, myxid,
ShareLock, false))
elog(ERROR, "XactLockTableWait: LockAcquire failed");
- LockRelease(LockTableId, &tag, GetCurrentTransactionId(), ShareLock);
+ LockRelease(LockTableId, &tag, myxid, ShareLock);
/*
* Transaction was committed/aborted/crashed - we have to update