88 *
99 *
1010 * IDENTIFICATION
11- * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.47 2001/06/19 19:42:16 tgl Exp $
11+ * $Header: /cvsroot/pgsql/src/backend/storage/lmgr/lmgr.c,v 1.48 2001/06/22 00:04:59 tgl Exp $
1212 *
1313 *-------------------------------------------------------------------------
1414 */
2424
2525
2626static LOCKMASK LockConflicts []= {
27- ( int ) NULL ,
27+ 0 ,
2828
29- /* AccessShareLock */
29+ /* AccessShareLock */
3030(1 <<AccessExclusiveLock ),
3131
32- /* RowShareLock */
32+ /* RowShareLock */
3333(1 <<ExclusiveLock ) | (1 <<AccessExclusiveLock ),
3434
35- /* RowExclusiveLock */
35+ /* RowExclusiveLock */
3636(1 <<ExclusiveLock ) | (1 <<ShareRowExclusiveLock ) | (1 <<ShareLock ) |
3737(1 <<AccessExclusiveLock ),
3838
39- /* ShareLock */
39+ /* ShareLock */
4040(1 <<ExclusiveLock ) | (1 <<ShareRowExclusiveLock ) |
4141(1 <<RowExclusiveLock ) | (1 <<AccessExclusiveLock ),
4242
43- /* ShareRowExclusiveLock */
43+ /* ShareRowExclusiveLock */
4444(1 <<ExclusiveLock ) | (1 <<ShareRowExclusiveLock ) |
4545(1 <<ShareLock ) | (1 <<RowExclusiveLock ) | (1 <<AccessExclusiveLock ),
4646
47- /* ExclusiveLock */
47+ /* ExclusiveLock */
4848(1 <<ExclusiveLock ) | (1 <<ShareRowExclusiveLock ) | (1 <<ShareLock ) |
4949(1 <<RowExclusiveLock ) | (1 <<RowShareLock ) | (1 <<AccessExclusiveLock ),
5050
51- /* AccessExclusiveLock */
51+ /* AccessExclusiveLock */
5252(1 <<ExclusiveLock ) | (1 <<ShareRowExclusiveLock ) | (1 <<ShareLock ) |
53- (1 <<RowExclusiveLock ) | (1 <<RowShareLock ) | ( 1 << AccessExclusiveLock ) |
54- (1 <<AccessShareLock ),
53+ (1 <<RowExclusiveLock ) | (1 <<RowShareLock ) |
54+ (1 <<AccessExclusiveLock ) | ( 1 << AccessShareLock )
5555
5656};
5757
5858static int LockPrios []= {
59- (int )NULL ,
59+ 0 ,
60+ /* AccessShareLock */
60611 ,
62+ /* RowShareLock */
61632 ,
64+ /* RowExclusiveLock */
62653 ,
66+ /* ShareLock */
63674 ,
68+ /* ShareRowExclusiveLock */
64695 ,
70+ /* ExclusiveLock */
65716 ,
72+ /* AccessExclusiveLock */
66737
6774};
6875
@@ -134,7 +141,8 @@ LockRelation(Relation relation, LOCKMODE lockmode)
134141tag .dbId = relation -> rd_lockInfo .lockRelId .dbId ;
135142tag .objId .blkno = InvalidBlockNumber ;
136143
137- if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),lockmode ))
144+ if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),
145+ lockmode , false))
138146elog (ERROR ,"LockRelation: LockAcquire failed" );
139147
140148/*
@@ -148,6 +156,45 @@ LockRelation(Relation relation, LOCKMODE lockmode)
148156RelationDecrementReferenceCount (relation );
149157}
150158
159+ /*
160+ *ConditionalLockRelation
161+ *
162+ * As above, but only lock if we can get the lock without blocking.
163+ * Returns TRUE iff the lock was acquired.
164+ *
165+ * NOTE: we do not currently need conditional versions of the other
166+ * LockXXX routines in this file, but they could easily be added if needed.
167+ */
168+ bool
169+ ConditionalLockRelation (Relation relation ,LOCKMODE lockmode )
170+ {
171+ LOCKTAG tag ;
172+
173+ if (LockingDisabled ())
174+ return true;
175+
176+ MemSet (& tag ,0 ,sizeof (tag ));
177+ tag .relId = relation -> rd_lockInfo .lockRelId .relId ;
178+ tag .dbId = relation -> rd_lockInfo .lockRelId .dbId ;
179+ tag .objId .blkno = InvalidBlockNumber ;
180+
181+ if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),
182+ lockmode , true))
183+ return false;
184+
185+ /*
186+ * Check to see if the relcache entry has been invalidated while we
187+ * were waiting to lock it. If so, rebuild it, or elog() trying.
188+ * Increment the refcount to ensure that RelationFlushRelation will
189+ * rebuild it and not just delete it.
190+ */
191+ RelationIncrementReferenceCount (relation );
192+ AcceptInvalidationMessages ();
193+ RelationDecrementReferenceCount (relation );
194+
195+ return true;
196+ }
197+
151198/*
152199 *UnlockRelation
153200 */
@@ -192,7 +239,8 @@ LockRelationForSession(LockRelId *relid, LOCKMODE lockmode)
192239tag .dbId = relid -> dbId ;
193240tag .objId .blkno = InvalidBlockNumber ;
194241
195- if (!LockAcquire (LockTableId ,& tag ,InvalidTransactionId ,lockmode ))
242+ if (!LockAcquire (LockTableId ,& tag ,InvalidTransactionId ,
243+ lockmode , false))
196244elog (ERROR ,"LockRelationForSession: LockAcquire failed" );
197245}
198246
@@ -231,7 +279,8 @@ LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
231279tag .dbId = relation -> rd_lockInfo .lockRelId .dbId ;
232280tag .objId .blkno = blkno ;
233281
234- if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),lockmode ))
282+ if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),
283+ lockmode , false))
235284elog (ERROR ,"LockPage: LockAcquire failed" );
236285}
237286
@@ -267,7 +316,8 @@ XactLockTableInsert(TransactionId xid)
267316tag .dbId = InvalidOid ;/* xids are globally unique */
268317tag .objId .xid = xid ;
269318
270- if (!LockAcquire (LockTableId ,& tag ,xid ,ExclusiveLock ))
319+ if (!LockAcquire (LockTableId ,& tag ,xid ,
320+ ExclusiveLock , false))
271321elog (ERROR ,"XactLockTableInsert: LockAcquire failed" );
272322}
273323
@@ -303,7 +353,8 @@ XactLockTableWait(TransactionId xid)
303353tag .dbId = InvalidOid ;
304354tag .objId .xid = xid ;
305355
306- if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),ShareLock ))
356+ if (!LockAcquire (LockTableId ,& tag ,GetCurrentTransactionId (),
357+ ShareLock , false))
307358elog (ERROR ,"XactLockTableWait: LockAcquire failed" );
308359
309360LockRelease (LockTableId ,& tag ,GetCurrentTransactionId (),ShareLock );