18#error "lock.h may not be included from frontend code"
66#define InvalidLocalTransactionId 0
67#define LocalTransactionIdIsValid(lxid) ((lxid) != InvalidLocalTransactionId)
68#define VirtualTransactionIdIsValid(vxid) \
69 (LocalTransactionIdIsValid((vxid).localTransactionId))
70#define VirtualTransactionIdIsRecoveredPreparedXact(vxid) \
71 ((vxid).procNumber == INVALID_PROC_NUMBER)
72#define VirtualTransactionIdEquals(vxid1, vxid2) \
73 ((vxid1).procNumber == (vxid2).procNumber && \
74 (vxid1).localTransactionId == (vxid2).localTransactionId)
75#define SetInvalidVirtualTransactionId(vxid) \
76 ((vxid).procNumber = INVALID_PROC_NUMBER, \
77 (vxid).localTransactionId = InvalidLocalTransactionId)
78#define GET_VXID_FROM_PGPROC(vxid_dst, proc) \
79 ((vxid_dst).procNumber = (proc).vxid.procNumber, \
80 (vxid_dst).localTransactionId = (proc).vxid.lxid)
83#define MAX_LOCKMODES 10
85#define LOCKBIT_ON(lockmode) (1 << (lockmode))
86#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
126#define DEFAULT_LOCKMETHOD 1
127#define USER_LOCKMETHOD 2
153#define LOCKTAG_LAST_TYPE LOCKTAG_APPLY_TRANSACTION
182#define SET_LOCKTAG_RELATION(locktag,dboid,reloid) \
183 ((locktag).locktag_field1 = (dboid), \
184 (locktag).locktag_field2 = (reloid), \
185 (locktag).locktag_field3 = 0, \
186 (locktag).locktag_field4 = 0, \
187 (locktag).locktag_type = LOCKTAG_RELATION, \
188 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
191#define SET_LOCKTAG_RELATION_EXTEND(locktag,dboid,reloid) \
192 ((locktag).locktag_field1 = (dboid), \
193 (locktag).locktag_field2 = (reloid), \
194 (locktag).locktag_field3 = 0, \
195 (locktag).locktag_field4 = 0, \
196 (locktag).locktag_type = LOCKTAG_RELATION_EXTEND, \
197 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
200#define SET_LOCKTAG_DATABASE_FROZEN_IDS(locktag,dboid) \
201 ((locktag).locktag_field1 = (dboid), \
202 (locktag).locktag_field2 = 0, \
203 (locktag).locktag_field3 = 0, \
204 (locktag).locktag_field4 = 0, \
205 (locktag).locktag_type = LOCKTAG_DATABASE_FROZEN_IDS, \
206 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
209#define SET_LOCKTAG_PAGE(locktag,dboid,reloid,blocknum) \
210 ((locktag).locktag_field1 = (dboid), \
211 (locktag).locktag_field2 = (reloid), \
212 (locktag).locktag_field3 = (blocknum), \
213 (locktag).locktag_field4 = 0, \
214 (locktag).locktag_type = LOCKTAG_PAGE, \
215 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
218#define SET_LOCKTAG_TUPLE(locktag,dboid,reloid,blocknum,offnum) \
219 ((locktag).locktag_field1 = (dboid), \
220 (locktag).locktag_field2 = (reloid), \
221 (locktag).locktag_field3 = (blocknum), \
222 (locktag).locktag_field4 = (offnum), \
223 (locktag).locktag_type = LOCKTAG_TUPLE, \
224 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
227#define SET_LOCKTAG_TRANSACTION(locktag,xid) \
228 ((locktag).locktag_field1 = (xid), \
229 (locktag).locktag_field2 = 0, \
230 (locktag).locktag_field3 = 0, \
231 (locktag).locktag_field4 = 0, \
232 (locktag).locktag_type = LOCKTAG_TRANSACTION, \
233 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
236#define SET_LOCKTAG_VIRTUALTRANSACTION(locktag,vxid) \
237 ((locktag).locktag_field1 = (vxid).procNumber, \
238 (locktag).locktag_field2 = (vxid).localTransactionId, \
239 (locktag).locktag_field3 = 0, \
240 (locktag).locktag_field4 = 0, \
241 (locktag).locktag_type = LOCKTAG_VIRTUALTRANSACTION, \
242 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
248#define SET_LOCKTAG_SPECULATIVE_INSERTION(locktag,xid,token) \
249 ((locktag).locktag_field1 = (xid), \
250 (locktag).locktag_field2 = (token), \
251 (locktag).locktag_field3 = 0, \
252 (locktag).locktag_field4 = 0, \
253 (locktag).locktag_type = LOCKTAG_SPECULATIVE_TOKEN, \
254 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
263#define SET_LOCKTAG_OBJECT(locktag,dboid,classoid,objoid,objsubid) \
264 ((locktag).locktag_field1 = (dboid), \
265 (locktag).locktag_field2 = (classoid), \
266 (locktag).locktag_field3 = (objoid), \
267 (locktag).locktag_field4 = (objsubid), \
268 (locktag).locktag_type = LOCKTAG_OBJECT, \
269 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
271#define SET_LOCKTAG_ADVISORY(locktag,id1,id2,id3,id4) \
272 ((locktag).locktag_field1 = (id1), \
273 (locktag).locktag_field2 = (id2), \
274 (locktag).locktag_field3 = (id3), \
275 (locktag).locktag_field4 = (id4), \
276 (locktag).locktag_type = LOCKTAG_ADVISORY, \
277 (locktag).locktag_lockmethodid = USER_LOCKMETHOD)
283#define SET_LOCKTAG_APPLY_TRANSACTION(locktag,dboid,suboid,xid,objid) \
284 ((locktag).locktag_field1 = (dboid), \
285 (locktag).locktag_field2 = (suboid), \
286 (locktag).locktag_field3 = (xid), \
287 (locktag).locktag_field4 = (objid), \
288 (locktag).locktag_type = LOCKTAG_APPLY_TRANSACTION, \
289 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
325#define LOCK_LOCKMETHOD(lock) ((LOCKMETHODID) (lock).tag.locktag_lockmethodid)
326#define LOCK_LOCKTAG(lock) ((LockTagType) (lock).tag.locktag_type)
383#define PROCLOCK_LOCKMETHOD(proclock) \
384 LOCK_LOCKMETHOD(*((proclock).tag.myLock))
444#define LOCALLOCK_LOCKMETHOD(llock) ((llock).tag.lock.locktag_lockmethodid)
445#define LOCALLOCK_LOCKTAG(llock) ((LockTagType) (llock).tag.lock.locktag_type)
525#define LockHashPartition(hashcode) \
526 ((hashcode) % NUM_LOCK_PARTITIONS)
527#define LockHashPartitionLock(hashcode) \
528 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + \
529 LockHashPartition(hashcode)].lock)
530#define LockHashPartitionLockByIndex(i) \
531 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + (i)].lock)
542#define LockHashPartitionLockByProc(leader_pgproc) \
543 LockHashPartitionLock(GetNumberFromPGProc(leader_pgproc))
563 bool reportMemoryError,
565 bool logLockFailure);
569 LOCKMODE lockmode,
bool sessionLock);
575 LOCKMODE lockmode,
bool orstronger);
576#ifdef USE_ASSERT_CHECKING
577extern HTAB *GetLockMethodLocalHash(
void);
580 LOCKMODE lockmode,
bool sessionLock);
620extern void DumpLocks(
PGPROC *proc);
621extern void DumpAllLocks(
void);
uint32 LocalTransactionId
LockAcquireResult LockAcquire(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait)
bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode, bool orstronger)
PGDLLIMPORT int max_locks_per_xact
bool DoLockModesConflict(LOCKMODE mode1, LOCKMODE mode2)
struct LOCALLOCK LOCALLOCK
const LockMethodData * LockMethod
void VirtualXactLockTableInsert(VirtualTransactionId vxid)
PGPROC * GetBlockingAutoVacuumPgproc(void)
@ LOCKTAG_RELATION_EXTEND
@ LOCKTAG_SPECULATIVE_TOKEN
@ LOCKTAG_APPLY_TRANSACTION
@ LOCKTAG_DATABASE_FROZEN_IDS
@ LOCKTAG_VIRTUALTRANSACTION
void GrantAwaitedLock(void)
int LockWaiterCount(const LOCKTAG *locktag)
void AtPrepare_Locks(void)
bool LockRelease(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
void lock_twophase_postcommit(TransactionId xid, uint16 info, void *recdata, uint32 len)
Size LockManagerShmemSize(void)
void RememberSimpleDeadLock(PGPROC *proc1, LOCKMODE lockmode, LOCK *lock, PGPROC *proc2)
struct LOCALLOCKOWNER LOCALLOCKOWNER
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)
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)
struct LockMethodData LockMethodData
void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks)
struct BlockedProcData BlockedProcData
void AbortStrongLockAcquire(void)
@ DS_BLOCKED_BY_AUTOVACUUM
struct LockInstanceData LockInstanceData
BlockedProcsData * GetBlockerStatusData(int blocked_pid)
void LockManagerShmemInit(void)
void lock_twophase_postabort(TransactionId xid, uint16 info, void *recdata, uint32 len)
bool LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
struct PROCLOCKTAG PROCLOCKTAG
PGDLLIMPORT const char *const LockTagTypeNames[]
void lock_twophase_standby_recover(TransactionId xid, uint16 info, void *recdata, uint32 len)
void InitDeadLockChecking(void)
void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks)
LOCALLOCK * GetAwaitedLock(void)
void lock_twophase_recover(TransactionId xid, uint16 info, void *recdata, uint32 len)
void LockReleaseSession(LOCKMETHODID lockmethodid)
void MarkLockClear(LOCALLOCK *locallock)
LockData * GetLockStatusData(void)
DeadLockState DeadLockCheck(PGPROC *proc)
uint32 LockTagHashCode(const LOCKTAG *locktag)
bool LockCheckConflicts(LockMethod lockMethodTable, LOCKMODE lockmode, LOCK *lock, PROCLOCK *proclock)
pg_noreturn void DeadLockReport(void)
struct LOCALLOCKTAG LOCALLOCKTAG
PGDLLIMPORT bool log_lock_failure
LockMethod GetLocksMethodTable(const LOCK *lock)
void PostPrepare_Locks(TransactionId xid)
@ LOCKACQUIRE_ALREADY_CLEAR
@ LOCKACQUIRE_ALREADY_HELD
struct BlockedProcsData BlockedProcsData
xl_standby_lock * GetRunningTransactionLocks(int *nlocks)
LockMethod GetLockTagsMethodTable(const LOCKTAG *locktag)
static PgChecksumMode mode
struct ResourceOwnerData * owner
LOCALLOCKOWNER * lockOwners
bool holdsStrongLockCount
uint8 locktag_lockmethodid
int requested[MAX_LOCKMODES]
int granted[MAX_LOCKMODES]
VirtualTransactionId vxid
const LOCKMASK * conflictTab
const char *const * lockModeNames
LocalTransactionId localTransactionId