8
8
*
9
9
*
10
10
* 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 $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
24
24
25
25
26
26
static LOCKMASK LockConflicts [] = {
27
- ( int ) NULL ,
27
+ 0 ,
28
28
29
- /* AccessShareLock */
29
+ /* AccessShareLock */
30
30
(1 << AccessExclusiveLock ),
31
31
32
- /* RowShareLock */
32
+ /* RowShareLock */
33
33
(1 << ExclusiveLock ) | (1 << AccessExclusiveLock ),
34
34
35
- /* RowExclusiveLock */
35
+ /* RowExclusiveLock */
36
36
(1 << ExclusiveLock ) | (1 << ShareRowExclusiveLock ) | (1 << ShareLock ) |
37
37
(1 << AccessExclusiveLock ),
38
38
39
- /* ShareLock */
39
+ /* ShareLock */
40
40
(1 << ExclusiveLock ) | (1 << ShareRowExclusiveLock ) |
41
41
(1 << RowExclusiveLock ) | (1 << AccessExclusiveLock ),
42
42
43
- /* ShareRowExclusiveLock */
43
+ /* ShareRowExclusiveLock */
44
44
(1 << ExclusiveLock ) | (1 << ShareRowExclusiveLock ) |
45
45
(1 << ShareLock ) | (1 << RowExclusiveLock ) | (1 << AccessExclusiveLock ),
46
46
47
- /* ExclusiveLock */
47
+ /* ExclusiveLock */
48
48
(1 << ExclusiveLock ) | (1 << ShareRowExclusiveLock ) | (1 << ShareLock ) |
49
49
(1 << RowExclusiveLock ) | (1 << RowShareLock ) | (1 << AccessExclusiveLock ),
50
50
51
- /* AccessExclusiveLock */
51
+ /* AccessExclusiveLock */
52
52
(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 )
55
55
56
56
};
57
57
58
58
static int LockPrios [] = {
59
- (int ) NULL ,
59
+ 0 ,
60
+ /* AccessShareLock */
60
61
1 ,
62
+ /* RowShareLock */
61
63
2 ,
64
+ /* RowExclusiveLock */
62
65
3 ,
66
+ /* ShareLock */
63
67
4 ,
68
+ /* ShareRowExclusiveLock */
64
69
5 ,
70
+ /* ExclusiveLock */
65
71
6 ,
72
+ /* AccessExclusiveLock */
66
73
7
67
74
};
68
75
@@ -134,7 +141,8 @@ LockRelation(Relation relation, LOCKMODE lockmode)
134
141
tag .dbId = relation -> rd_lockInfo .lockRelId .dbId ;
135
142
tag .objId .blkno = InvalidBlockNumber ;
136
143
137
- if (!LockAcquire (LockTableId , & tag , GetCurrentTransactionId (), lockmode ))
144
+ if (!LockAcquire (LockTableId , & tag , GetCurrentTransactionId (),
145
+ lockmode , false))
138
146
elog (ERROR , "LockRelation: LockAcquire failed" );
139
147
140
148
/*
@@ -148,6 +156,45 @@ LockRelation(Relation relation, LOCKMODE lockmode)
148
156
RelationDecrementReferenceCount (relation );
149
157
}
150
158
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
+
151
198
/*
152
199
* UnlockRelation
153
200
*/
@@ -192,7 +239,8 @@ LockRelationForSession(LockRelId *relid, LOCKMODE lockmode)
192
239
tag .dbId = relid -> dbId ;
193
240
tag .objId .blkno = InvalidBlockNumber ;
194
241
195
- if (!LockAcquire (LockTableId , & tag , InvalidTransactionId , lockmode ))
242
+ if (!LockAcquire (LockTableId , & tag , InvalidTransactionId ,
243
+ lockmode , false))
196
244
elog (ERROR , "LockRelationForSession: LockAcquire failed" );
197
245
}
198
246
@@ -231,7 +279,8 @@ LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode)
231
279
tag .dbId = relation -> rd_lockInfo .lockRelId .dbId ;
232
280
tag .objId .blkno = blkno ;
233
281
234
- if (!LockAcquire (LockTableId , & tag , GetCurrentTransactionId (), lockmode ))
282
+ if (!LockAcquire (LockTableId , & tag , GetCurrentTransactionId (),
283
+ lockmode , false))
235
284
elog (ERROR , "LockPage: LockAcquire failed" );
236
285
}
237
286
@@ -267,7 +316,8 @@ XactLockTableInsert(TransactionId xid)
267
316
tag .dbId = InvalidOid ; /* xids are globally unique */
268
317
tag .objId .xid = xid ;
269
318
270
- if (!LockAcquire (LockTableId , & tag , xid , ExclusiveLock ))
319
+ if (!LockAcquire (LockTableId , & tag , xid ,
320
+ ExclusiveLock , false))
271
321
elog (ERROR , "XactLockTableInsert: LockAcquire failed" );
272
322
}
273
323
@@ -303,7 +353,8 @@ XactLockTableWait(TransactionId xid)
303
353
tag .dbId = InvalidOid ;
304
354
tag .objId .xid = xid ;
305
355
306
- if (!LockAcquire (LockTableId , & tag , GetCurrentTransactionId (), ShareLock ))
356
+ if (!LockAcquire (LockTableId , & tag , GetCurrentTransactionId (),
357
+ ShareLock , false))
307
358
elog (ERROR , "XactLockTableWait: LockAcquire failed" );
308
359
309
360
LockRelease (LockTableId , & tag , GetCurrentTransactionId (), ShareLock );
0 commit comments