60 mul_size(max_locks_per_xact, add_size(MaxBackends, max_prepared_xacts))
117 "ShareUpdateExclusiveLock",
119 "ShareRowExclusiveLock",
121 "AccessExclusiveLock"
220#define FAST_PATH_REL_GROUP(rel) \
221 (((uint64) (rel) * 49157) & (FastPathLockGroupsPerBackend - 1))
227#define FAST_PATH_SLOT(group, index) \
228 (AssertMacro((uint32) (group) < FastPathLockGroupsPerBackend), \
229 AssertMacro((uint32) (index) < FP_LOCK_SLOTS_PER_GROUP), \
230 ((group) * FP_LOCK_SLOTS_PER_GROUP + (index)))
236#define FAST_PATH_GROUP(index) \
237 (AssertMacro((uint32) (index) < FastPathLockSlotsPerBackend()), \
238 ((index) / FP_LOCK_SLOTS_PER_GROUP))
239#define FAST_PATH_INDEX(index) \
240 (AssertMacro((uint32) (index) < FastPathLockSlotsPerBackend()), \
241 ((index) % FP_LOCK_SLOTS_PER_GROUP))
244#define FAST_PATH_BITS_PER_SLOT 3
245#define FAST_PATH_LOCKNUMBER_OFFSET 1
246#define FAST_PATH_MASK ((1 << FAST_PATH_BITS_PER_SLOT) - 1)
247#define FAST_PATH_BITS(proc, n) (proc)->fpLockBits[FAST_PATH_GROUP(n)]
248#define FAST_PATH_GET_BITS(proc, n) \
249 ((FAST_PATH_BITS(proc, n) >> (FAST_PATH_BITS_PER_SLOT * FAST_PATH_INDEX(n))) & FAST_PATH_MASK)
250#define FAST_PATH_BIT_POSITION(n, l) \
251 (AssertMacro((l) >= FAST_PATH_LOCKNUMBER_OFFSET), \
252 AssertMacro((l) < FAST_PATH_BITS_PER_SLOT+FAST_PATH_LOCKNUMBER_OFFSET), \
253 AssertMacro((n) < FastPathLockSlotsPerBackend()), \
254 ((l) - FAST_PATH_LOCKNUMBER_OFFSET + FAST_PATH_BITS_PER_SLOT * (FAST_PATH_INDEX(n))))
255#define FAST_PATH_SET_LOCKMODE(proc, n, l) \
256 FAST_PATH_BITS(proc, n) |= UINT64CONST(1) << FAST_PATH_BIT_POSITION(n, l)
257#define FAST_PATH_CLEAR_LOCKMODE(proc, n, l) \
258 FAST_PATH_BITS(proc, n) &= ~(UINT64CONST(1) << FAST_PATH_BIT_POSITION(n, l))
259#define FAST_PATH_CHECK_LOCKMODE(proc, n, l) \
260 (FAST_PATH_BITS(proc, n) & (UINT64CONST(1) << FAST_PATH_BIT_POSITION(n, l)))
270#define EligibleForRelationFastPath(locktag, mode) \
271 ((locktag)->locktag_lockmethodid == DEFAULT_LOCKMETHOD && \
272 (locktag)->locktag_type == LOCKTAG_RELATION && \
273 (locktag)->locktag_field1 == MyDatabaseId && \
274 MyDatabaseId != InvalidOid && \
275 (mode) < ShareUpdateExclusiveLock)
276#define ConflictsWithRelationFastPath(locktag, mode) \
277 ((locktag)->locktag_lockmethodid == DEFAULT_LOCKMETHOD && \
278 (locktag)->locktag_type == LOCKTAG_RELATION && \
279 (locktag)->locktag_field1 != InvalidOid && \
280 (mode) > ShareUpdateExclusiveLock)
303#define FAST_PATH_STRONG_LOCK_HASH_BITS 10
304#define FAST_PATH_STRONG_LOCK_HASH_PARTITIONS \
305 (1 << FAST_PATH_STRONG_LOCK_HASH_BITS)
306#define FastPathStrongLockHashPartition(hashcode) \
307 ((hashcode) % FAST_PATH_STRONG_LOCK_HASH_PARTITIONS)
385 "%s: lock(%p) id(%u,%u,%u,%u,%u,%u) grantMask(%x) "
386 "req(%d,%d,%d,%d,%d,%d,%d)=%d "
387 "grant(%d,%d,%d,%d,%d,%d,%d)=%d wait(%d) type(%s)",
409 "%s: proclock(%p) lock(%p) method(%u) proc(%p) hold(%x)",
416#define LOCK_PRINT(where, lock, type) ((void) 0)
417#define PROCLOCK_PRINT(where, proclockP) ((void) 0)
469 .hash_info.entrysize =
sizeof(
LOCK),
481 .hash_info.entrysize =
sizeof(
PROCLOCK),
677#ifdef USE_ASSERT_CHECKING
709 elog(
ERROR,
"unrecognized lock mode: %d", lockmode);
713 elog(
LOG,
"LockHasWaiters: lock [%u,%u] %s",
752 LOCK_PRINT(
"LockHasWaiters: found", lock, lockmode);
860 elog(
ERROR,
"unrecognized lock mode: %d", lockmode);
868 errmsg(
"cannot acquire lock mode %s on database objects while recovery is in progress",
870 errhint(
"Only RowExclusiveLock or less can be acquired on database objects during recovery.")));
874 elog(
LOG,
"LockAcquire: lock [%u,%u] %s",
1051 errmsg(
"out of shared memory"),
1052 errhint(
"You might need to increase \"%s\".",
"max_locks_per_transaction")));
1077 hashcode, lockmode);
1089 errmsg(
"out of shared memory"),
1090 errhint(
"You might need to increase \"%s\".",
"max_locks_per_transaction")));
1150 elog(
PANIC,
"proclock table corrupted");
1153 PROCLOCK_PRINT(
"LockAcquire: did not join wait queue", proclock);
1156 LOCK_PRINT(
"LockAcquire: did not join wait queue",
1195 (
errmsg(
"process %d could not obtain %s on %s",
1198 "Process holding the lock: %s, Wait queue: %s.",
1199 "Processes holding the lock: %s, Wait queue: %s.",
1227 LOCK_PRINT(
"LockAcquire: sleeping on lock", lock, lockmode);
1325 LOCK_PRINT(
"LockAcquire: new", lock, lockmode);
1329 LOCK_PRINT(
"LockAcquire: found", lock, lockmode);
1404#ifdef CHECK_DEADLOCK_RISK
1427 if (
i >= (
int) lockmode)
1429 elog(
LOG,
"deadlock risk: raising lock level"
1430 " from %s to %s on object %u/%u/%u",
1456 elog(
ERROR,
"lock %s on object %u/%u/%u is already held",
1475#ifdef USE_ASSERT_CHECKING
1508 locallock->holdsStrongLockCount =
false;
1572 for (
i = 1;
i <= numLockModes;
i++)
1588 PROCLOCK_PRINT(
"LockCheckConflicts: resolved (simple)", proclock);
1630 for (
i = 1;
i <= numLockModes;
i++)
1635 elog(
PANIC,
"proclocks held do not match lock");
1651 PROCLOCK_PRINT(
"LockCheckConflicts: conflicting (group)", proclock);
1707 if (lock->
granted[lockmode] == 0)
1713 LOCK_PRINT(
"UnGrantLock: updated", lock, lockmode);
1768 elog(
PANIC,
"proclock table corrupted");
1777 LOCK_PRINT(
"CleanUpLock: deleting", lock, 0);
1812 if (lockOwners[
i].owner == owner)
1818 lockOwners[
i].
owner = owner;
1882 locallock->holdsStrongLockCount =
false;
2126 elog(
ERROR,
"unrecognized lock mode: %d", lockmode);
2130 elog(
LOG,
"LockRelease: lock [%u,%u] %s",
2172 if (lockOwners[
i].owner == owner)
2174 Assert(lockOwners[
i].nLocks > 0);
2175 if (--lockOwners[
i].nLocks == 0)
2182 lockOwners[
i] = lockOwners[
locallock->numLockOwners];
2262 elog(
ERROR,
"failed to re-find shared lock object");
2272 elog(
ERROR,
"failed to re-find shared proclock object");
2274 LOCK_PRINT(
"LockRelease: found", lock, lockmode);
2385 if (lockOwners[
i].owner ==
NULL)
2386 lockOwners[0] = lockOwners[
i];
2393 lockOwners[0].
nLocks > 0)
2405#ifdef USE_ASSERT_CHECKING
2426 elog(
PANIC,
"locallock table corrupted");
2443 relid =
locallock->tag.lock.locktag_field2;
2557 for (
i = 1;
i <= numLockModes;
i++)
2565 LOCK_PRINT(
"LockReleaseAll: updated", lock, 0);
2581 elog(
LOG,
"LockReleaseAll done");
2636 for (
i = nlocks - 1;
i >= 0;
i--)
2671 if (lockOwners[
i].owner == owner)
2673 Assert(lockOwners[
i].nLocks > 0);
2686 lockOwners[
i] = lockOwners[
locallock->numLockOwners];
2735 for (
i = nlocks - 1;
i >= 0;
i--)
2761 else if (lockOwners[
i].owner == parent)
2771 lockOwners[
ic].
owner = parent;
2781 lockOwners[
ic] = lockOwners[
locallock->numLockOwners];
2939 hashcode, lockmode);
3009 errmsg(
"out of shared memory"),
3010 errhint(
"You might need to increase \"%s\".",
"max_locks_per_transaction")));
3024 if (proclock ==
NULL)
3038 elog(
ERROR,
"failed to re-find shared lock object");
3051 elog(
ERROR,
"failed to re-find shared proclock object");
3096 elog(
ERROR,
"unrecognized lock mode: %d", lockmode);
3179 if (relid != proc->
fpRelId[f])
3197 vxids[count++] = vxid;
3262 vxids[count++] = vxid;
3272 elog(
PANIC,
"too many conflicting locks found");
3319 elog(
PANIC,
"failed to re-find shared lock object");
3335 elog(
PANIC,
"failed to re-find shared proclock object");
3452 if (lockOwners[
i].owner ==
NULL)
3465 errmsg(
"cannot PREPARE while holding both session-level and transaction-level locks on the same object")));
3519 if (lockOwners[
i].owner ==
NULL)
3533 errmsg(
"cannot PREPARE while holding both session-level and transaction-level locks on the same object")));
3552 locallock->holdsStrongLockCount =
false;
3635 if (lockOwners[
i].owner ==
NULL)
3649 errmsg(
"cannot PREPARE while holding both session-level and transaction-level locks on the same object")));
3708 elog(
PANIC,
"we seem to have dropped a bit somewhere");
3746 elog(
PANIC,
"duplicate entry found while reassigning a prepared transaction's locks");
4093 if (
data->nlocks >=
data->maxlocks)
4119 if (queue_size >
data->maxpids -
data->npids)
4122 data->npids + queue_size);
4124 sizeof(
int) *
data->maxpids);
4305 elog(
LOG,
"DumpAllLocks: proclock->tag.myLock = NULL");
4386 errmsg(
"out of shared memory"),
4387 errhint(
"You might need to increase \"%s\".",
"max_locks_per_transaction")));
4403 LOCK_PRINT(
"lock_twophase_recover: new", lock, lockmode);
4407 LOCK_PRINT(
"lock_twophase_recover: found", lock, lockmode);
4451 errmsg(
"out of shared memory"),
4452 errhint(
"You might need to increase \"%s\".",
"max_locks_per_transaction")));
4488 elog(
ERROR,
"lock %s on object %u/%u/%u is already held",
4801 errmsg(
"out of shared memory"),
4802 errhint(
"You might need to increase \"%s\".",
"max_locks_per_transaction")));
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
#define Assert(condition)
uint32 LocalTransactionId
#define MemSet(start, val, len)
memcpy(sums, checksumBaseOffsets, sizeof(checksumBaseOffsets))
void DeadLockReport(void)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
void hash_destroy(HTAB *hashp)
void * hash_search_with_hash_value(HTAB *hashp, const void *keyPtr, uint32 hashvalue, HASHACTION action, bool *foundPtr)
void * hash_seq_search(HASH_SEQ_STATUS *status)
int64 hash_get_num_entries(HTAB *hashp)
bool hash_update_hash_key(HTAB *hashp, void *existingEntry, const void *newKeyPtr)
uint32 get_hash_value(HTAB *hashp, const void *keyPtr)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
ErrorContextCallback * error_context_stack
int errcode(int sqlerrcode)
int errhint(const char *fmt,...) pg_attribute_printf(1
#define ereport(elevel,...)
int int int int errdetail_log_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...) pg_attribute_printf(1
#define palloc_object(type)
#define palloc_array(type, count)
#define palloc0_array(type, count)
#define dlist_foreach(iter, lhead)
static void dlist_init(dlist_head *head)
static void dlist_delete(dlist_node *node)
static uint32 dclist_count(const dclist_head *head)
static bool dclist_is_empty(const dclist_head *head)
static bool dlist_node_is_detached(const dlist_node *node)
#define dlist_foreach_modify(iter, lhead)
static bool dlist_is_empty(const dlist_head *head)
static void dlist_push_tail(dlist_head *head, dlist_node *node)
static void dclist_delete_from_thoroughly(dclist_head *head, dlist_node *node)
static void dclist_init(dclist_head *head)
#define dlist_container(type, membername, ptr)
#define dclist_foreach(iter, lhead)
void DescribeLockTag(StringInfo buf, const LOCKTAG *tag)
static bool XactLockForVirtualXact(VirtualTransactionId vxid, TransactionId xid, bool wait)
LockAcquireResult LockAcquire(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait)
static LOCALLOCK * awaitedLock
static void RemoveLocalLock(LOCALLOCK *locallock)
static void LockReassignOwner(LOCALLOCK *locallock, ResourceOwner parent)
bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode, bool orstronger)
static const char *const lock_mode_names[]
void lock_twophase_postabort(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
#define LOCK_PRINT(where, lock, type)
void PostPrepare_Locks(FullTransactionId fxid)
void lock_twophase_standby_recover(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
bool DoLockModesConflict(LOCKMODE mode1, LOCKMODE mode2)
static PROCLOCK * SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc, const LOCKTAG *locktag, uint32 hashcode, LOCKMODE lockmode)
static PROCLOCK * FastPathGetRelationLockEntry(LOCALLOCK *locallock)
const ShmemCallbacks LockManagerShmemCallbacks
void VirtualXactLockTableInsert(VirtualTransactionId vxid)
#define FastPathStrongLockHashPartition(hashcode)
static uint32 ProcLockHashCode(const PROCLOCKTAG *proclocktag, uint32 hashcode)
#define FAST_PATH_CHECK_LOCKMODE(proc, n, l)
void GrantAwaitedLock(void)
int LockWaiterCount(const LOCKTAG *locktag)
void AtPrepare_Locks(void)
bool LockRelease(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
#define FAST_PATH_LOCKNUMBER_OFFSET
#define FAST_PATH_REL_GROUP(rel)
void InitLockManagerAccess(void)
void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode)
void VirtualXactLockTableCleanup(void)
bool VirtualXactLock(VirtualTransactionId vxid, bool wait)
VirtualTransactionId * GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp)
static volatile FastPathStrongRelationLockData * FastPathStrongRelationLocks
void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode)
LockAcquireResult LockAcquireExtended(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait, bool reportMemoryError, LOCALLOCK **locallockp, bool logLockFailure)
void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
#define FAST_PATH_SLOT(group, index)
static void CheckAndSetLockHeld(LOCALLOCK *locallock, bool acquired)
#define ConflictsWithRelationFastPath(locktag, mode)
void ResetAwaitedLock(void)
static bool FastPathTransferRelationLocks(LockMethod lockMethodTable, const LOCKTAG *locktag, uint32 hashcode)
static HTAB * LockMethodLocalHash
void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks)
static bool UnGrantLock(LOCK *lock, LOCKMODE lockmode, PROCLOCK *proclock, LockMethod lockMethodTable)
#define FAST_PATH_SET_LOCKMODE(proc, n, l)
#define PROCLOCK_PRINT(where, proclockP)
static void CleanUpLock(LOCK *lock, PROCLOCK *proclock, LockMethod lockMethodTable, uint32 hashcode, bool wakeupNeeded)
static uint32 proclock_hash(const void *key, Size keysize)
static bool FastPathUnGrantRelationLock(Oid relid, LOCKMODE lockmode)
void AbortStrongLockAcquire(void)
static bool FastPathGrantRelationLock(Oid relid, LOCKMODE lockmode)
static int FastPathLocalUseCounts[FP_LOCK_GROUPS_PER_BACKEND_MAX]
static HTAB * LockMethodLockHash
static ResourceOwner awaitedOwner
BlockedProcsData * GetBlockerStatusData(int blocked_pid)
static ProcWaitStatus WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner)
bool LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
static void GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data)
#define FAST_PATH_CLEAR_LOCKMODE(proc, n, l)
void lock_twophase_postcommit(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
static const LockMethod LockMethods[]
static void waitonlock_error_callback(void *arg)
void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks)
LOCALLOCK * GetAwaitedLock(void)
void LockReleaseSession(LOCKMETHODID lockmethodid)
void MarkLockClear(LOCALLOCK *locallock)
LockData * GetLockStatusData(void)
static bool IsRelationExtensionLockHeld PG_USED_FOR_ASSERTS_ONLY
static const LockMethodData default_lockmethod
#define FAST_PATH_GET_BITS(proc, n)
static LOCALLOCK * StrongLockInProgress
#define FAST_PATH_BITS_PER_SLOT
static const LockMethodData user_lockmethod
int FastPathLockGroupsPerBackend
#define EligibleForRelationFastPath(locktag, mode)
uint32 LockTagHashCode(const LOCKTAG *locktag)
static void BeginStrongLockAcquire(LOCALLOCK *locallock, uint32 fasthashcode)
bool LockCheckConflicts(LockMethod lockMethodTable, LOCKMODE lockmode, LOCK *lock, PROCLOCK *proclock)
static void LockManagerShmemRequest(void *arg)
void lock_twophase_recover(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
static void GrantLockLocal(LOCALLOCK *locallock, ResourceOwner owner)
static const LOCKMASK LockConflicts[]
static void ReleaseLockIfHeld(LOCALLOCK *locallock, bool sessionLock)
LockMethod GetLocksMethodTable(const LOCK *lock)
static void FinishStrongLockAcquire(void)
#define FAST_PATH_STRONG_LOCK_HASH_PARTITIONS
xl_standby_lock * GetRunningTransactionLocks(int *nlocks)
static void LockRefindAndRelease(LockMethod lockMethodTable, PGPROC *proc, LOCKTAG *locktag, LOCKMODE lockmode, bool decrement_strong_lock_count)
static void CheckForSessionAndXactLocks(void)
static HTAB * LockMethodProcLockHash
static void LockManagerShmemInit(void *arg)
LockMethod GetLockTagsMethodTable(const LOCKTAG *locktag)
#define LOCK_LOCKTAG(lock)
#define VirtualTransactionIdIsValid(vxid)
#define LockHashPartitionLock(hashcode)
#define GET_VXID_FROM_PGPROC(vxid_dst, proc)
#define LOCK_LOCKMETHOD(lock)
#define LOCKBIT_OFF(lockmode)
#define LOCALLOCK_LOCKMETHOD(llock)
#define InvalidLocalTransactionId
#define LOCKBIT_ON(lockmode)
#define LocalTransactionIdIsValid(lxid)
#define LOCALLOCK_LOCKTAG(llock)
#define LockHashPartition(hashcode)
#define VirtualTransactionIdEquals(vxid1, vxid2)
#define PROCLOCK_LOCKMETHOD(proclock)
#define LockHashPartitionLockByIndex(i)
@ LOCKACQUIRE_ALREADY_CLEAR
@ LOCKACQUIRE_ALREADY_HELD
#define VirtualTransactionIdIsRecoveredPreparedXact(vxid)
#define AccessExclusiveLock
#define ShareRowExclusiveLock
#define ShareUpdateExclusiveLock
#define DEFAULT_LOCKMETHOD
#define SET_LOCKTAG_VIRTUALTRANSACTION(locktag, vxid)
@ LOCKTAG_RELATION_EXTEND
@ LOCKTAG_VIRTUALTRANSACTION
#define SET_LOCKTAG_TRANSACTION(locktag, xid)
#define SET_LOCKTAG_RELATION(locktag, dboid, reloid)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
#define NUM_LOCK_PARTITIONS
#define LOG2_NUM_LOCK_PARTITIONS
void * MemoryContextAlloc(MemoryContext context, Size size)
void * repalloc(void *pointer, Size size)
void pfree(void *pointer)
MemoryContext TopMemoryContext
MemoryContext CurrentMemoryContext
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
static PgChecksumMode mode
static char buf[DEFAULT_XLOG_SEG_SIZE]
void pgstat_count_lock_fastpath_exceeded(uint8 locktag_type)
static uint32 DatumGetUInt32(Datum X)
static Datum PointerGetDatum(const void *X)
#define FP_LOCK_GROUPS_PER_BACKEND_MAX
#define FastPathLockSlotsPerBackend()
#define GetPGProcByNumber(n)
#define FP_LOCK_SLOTS_PER_GROUP
@ PROC_WAIT_STATUS_WAITING
PGPROC * BackendPidGetProcWithLock(int pid)
PGPROC * ProcNumberGetProc(ProcNumber procNumber)
#define INVALID_PROC_NUMBER
void set_ps_display_remove_suffix(void)
void set_ps_display_suffix(const char *suffix)
void ResourceOwnerRememberLock(ResourceOwner owner, LOCALLOCK *locallock)
ResourceOwner ResourceOwnerGetParent(ResourceOwner owner)
ResourceOwner CurrentResourceOwner
void ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock)
#define ShmemRequestHash(...)
#define ShmemRequestStruct(...)
static void SpinLockRelease(volatile slock_t *lock)
static void SpinLockAcquire(volatile slock_t *lock)
static void SpinLockInit(volatile slock_t *lock)
ProcWaitStatus JoinWaitQueue(LOCALLOCK *locallock, LockMethod lockMethodTable, bool dontWait)
void GetLockHoldersAndWaiters(LOCALLOCK *locallock, StringInfo lock_holders_sbuf, StringInfo lock_waiters_sbuf, int *lockHoldersNum)
ProcWaitStatus ProcSleep(LOCALLOCK *locallock)
void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock)
void LogAccessExclusiveLockPrepare(void)
void StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid)
void LogAccessExclusiveLock(Oid dbOid, Oid relOid)
void initStringInfo(StringInfo str)
struct ErrorContextCallback * previous
uint32 count[FAST_PATH_STRONG_LOCK_HASH_PARTITIONS]
struct ResourceOwnerData * owner
uint8 locktag_lockmethodid
int requested[MAX_LOCKMODES]
int granted[MAX_LOCKMODES]
const char *const * lockModeNames
dlist_head lockGroupMembers
pg_atomic_uint64 waitStart
LocalTransactionId fpLocalTransactionId
dlist_head myProcLocks[NUM_LOCK_PARTITIONS]
ProcWaitStatus waitStatus
ShmemRequestCallback request_fn
LocalTransactionId localTransactionId
#define InvalidTransactionId
#define XidFromFullTransactionId(x)
#define FirstNormalObjectId
#define TransactionIdIsValid(xid)
void RegisterTwoPhaseRecord(TwoPhaseRmgrId rmid, uint16 info, const void *data, uint32 len)
TransactionId TwoPhaseGetXidByVirtualXID(VirtualTransactionId vxid, bool *have_more)
PGPROC * TwoPhaseGetDummyProc(FullTransactionId fxid, bool lock_held)
#define TWOPHASE_RM_LOCK_ID
bool RecoveryInProgress(void)
#define XLogStandbyInfoActive()