MCPcopy Create free account
hub / github.com/apache/cloudberry / SetupLockInTable

Function SetupLockInTable

src/backend/storage/lmgr/lock.c:1354–1540  ·  view source on GitHub ↗

* Find or create LOCK and PROCLOCK objects as needed for a new lock * request. * * Returns the PROCLOCK object, or NULL if we failed to create the objects * for lack of shared memory. * * The appropriate partition lock must be held at entry, and will be * held at exit. */

Source from the content-addressed store, hash-verified

1352 * held at exit.
1353 */
1354static PROCLOCK *
1355SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc,
1356 const LOCKTAG *locktag, uint32 hashcode, LOCKMODE lockmode)
1357{
1358 LOCK *lock;
1359 PROCLOCK *proclock;
1360 PROCLOCKTAG proclocktag;
1361 uint32 proclock_hashcode;
1362 bool found;
1363
1364 /*
1365 * Find or create a lock with this tag.
1366 */
1367 lock = (LOCK *) hash_search_with_hash_value(LockMethodLockHash,
1368 (const void *) locktag,
1369 hashcode,
1370 HASH_ENTER_NULL,
1371 &found);
1372 if (!lock)
1373 return NULL;
1374
1375 /*
1376 * if it's a new lock object, initialize it
1377 */
1378 if (!found)
1379 {
1380 lock->grantMask = 0;
1381 lock->waitMask = 0;
1382 SHMQueueInit(&(lock->procLocks));
1383 ProcQueueInit(&(lock->waitProcs));
1384 lock->nRequested = 0;
1385 lock->nGranted = 0;
1386 MemSet(lock->requested, 0, sizeof(int) * MAX_LOCKMODES);
1387 MemSet(lock->granted, 0, sizeof(int) * MAX_LOCKMODES);
1388 /*
1389 * By default, holdTillEndXact is true only for LOCKTAG_TRANSACTION
1390 */
1391 lock->holdTillEndXact = locktag->locktag_type == LOCKTAG_TRANSACTION;
1392 LOCK_PRINT("LockAcquire: new", lock, lockmode);
1393 }
1394 else
1395 {
1396 LOCK_PRINT("LockAcquire: found", lock, lockmode);
1397 Assert((lock->nRequested >= 0) && (lock->requested[lockmode] >= 0));
1398 Assert((lock->nGranted >= 0) && (lock->granted[lockmode] >= 0));
1399 Assert(lock->nGranted <= lock->nRequested);
1400 }
1401
1402 /*
1403 * holdTillEndXact must be true for LOCKTAG_TRANSACTION and
1404 * false for LOCKTAG_RELATION_EXTEND no matter if it is a new lock or
1405 * an existing lock
1406 */
1407 AssertImply(locktag->locktag_type == LOCKTAG_TRANSACTION,
1408 lock->holdTillEndXact);
1409 AssertImply(locktag->locktag_type == LOCKTAG_RELATION_EXTEND,
1410 !(lock->holdTillEndXact));
1411

Callers 4

LockAcquireExtendedFunction · 0.85
VirtualXactLockFunction · 0.85

Calls 8

SHMQueueInitFunction · 0.85
ProcQueueInitFunction · 0.85
LOCK_PRINTFunction · 0.85
ProcLockHashCodeFunction · 0.85
SHMQueueEmptyFunction · 0.85
SHMQueueInsertBeforeFunction · 0.85
PROCLOCK_PRINTFunction · 0.85

Tested by

no test coverage detected