* 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. */
| 1352 | * held at exit. |
| 1353 | */ |
| 1354 | static PROCLOCK * |
| 1355 | SetupLockInTable(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 |
no test coverage detected