18#error "lock.h may not be included from frontend code"
67#define InvalidLocalTransactionId 0
68#define LocalTransactionIdIsValid(lxid) ((lxid) != InvalidLocalTransactionId)
69#define VirtualTransactionIdIsValid(vxid) \
70 (LocalTransactionIdIsValid((vxid).localTransactionId))
71#define VirtualTransactionIdIsRecoveredPreparedXact(vxid) \
72 ((vxid).procNumber == INVALID_PROC_NUMBER)
73#define VirtualTransactionIdEquals(vxid1, vxid2) \
74 ((vxid1).procNumber == (vxid2).procNumber && \
75 (vxid1).localTransactionId == (vxid2).localTransactionId)
76#define SetInvalidVirtualTransactionId(vxid) \
77 ((vxid).procNumber = INVALID_PROC_NUMBER, \
78 (vxid).localTransactionId = InvalidLocalTransactionId)
79#define GET_VXID_FROM_PGPROC(vxid_dst, proc) \
80 ((vxid_dst).procNumber = (proc).vxid.procNumber, \
81 (vxid_dst).localTransactionId = (proc).vxid.lxid)
84#define MAX_LOCKMODES 10
86#define LOCKBIT_ON(lockmode) (1 << (lockmode))
87#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
127#define DEFAULT_LOCKMETHOD 1
128#define USER_LOCKMETHOD 2
154#define LOCKTAG_LAST_TYPE LOCKTAG_APPLY_TRANSACTION
183#define SET_LOCKTAG_RELATION(locktag,dboid,reloid) \
184 ((locktag).locktag_field1 = (dboid), \
185 (locktag).locktag_field2 = (reloid), \
186 (locktag).locktag_field3 = 0, \
187 (locktag).locktag_field4 = 0, \
188 (locktag).locktag_type = LOCKTAG_RELATION, \
189 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
192#define SET_LOCKTAG_RELATION_EXTEND(locktag,dboid,reloid) \
193 ((locktag).locktag_field1 = (dboid), \
194 (locktag).locktag_field2 = (reloid), \
195 (locktag).locktag_field3 = 0, \
196 (locktag).locktag_field4 = 0, \
197 (locktag).locktag_type = LOCKTAG_RELATION_EXTEND, \
198 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
201#define SET_LOCKTAG_DATABASE_FROZEN_IDS(locktag,dboid) \
202 ((locktag).locktag_field1 = (dboid), \
203 (locktag).locktag_field2 = 0, \
204 (locktag).locktag_field3 = 0, \
205 (locktag).locktag_field4 = 0, \
206 (locktag).locktag_type = LOCKTAG_DATABASE_FROZEN_IDS, \
207 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
210#define SET_LOCKTAG_PAGE(locktag,dboid,reloid,blocknum) \
211 ((locktag).locktag_field1 = (dboid), \
212 (locktag).locktag_field2 = (reloid), \
213 (locktag).locktag_field3 = (blocknum), \
214 (locktag).locktag_field4 = 0, \
215 (locktag).locktag_type = LOCKTAG_PAGE, \
216 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
219#define SET_LOCKTAG_TUPLE(locktag,dboid,reloid,blocknum,offnum) \
220 ((locktag).locktag_field1 = (dboid), \
221 (locktag).locktag_field2 = (reloid), \
222 (locktag).locktag_field3 = (blocknum), \
223 (locktag).locktag_field4 = (offnum), \
224 (locktag).locktag_type = LOCKTAG_TUPLE, \
225 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
228#define SET_LOCKTAG_TRANSACTION(locktag,xid) \
229 ((locktag).locktag_field1 = (xid), \
230 (locktag).locktag_field2 = 0, \
231 (locktag).locktag_field3 = 0, \
232 (locktag).locktag_field4 = 0, \
233 (locktag).locktag_type = LOCKTAG_TRANSACTION, \
234 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
237#define SET_LOCKTAG_VIRTUALTRANSACTION(locktag,vxid) \
238 ((locktag).locktag_field1 = (vxid).procNumber, \
239 (locktag).locktag_field2 = (vxid).localTransactionId, \
240 (locktag).locktag_field3 = 0, \
241 (locktag).locktag_field4 = 0, \
242 (locktag).locktag_type = LOCKTAG_VIRTUALTRANSACTION, \
243 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
249#define SET_LOCKTAG_SPECULATIVE_INSERTION(locktag,xid,token) \
250 ((locktag).locktag_field1 = (xid), \
251 (locktag).locktag_field2 = (token), \
252 (locktag).locktag_field3 = 0, \
253 (locktag).locktag_field4 = 0, \
254 (locktag).locktag_type = LOCKTAG_SPECULATIVE_TOKEN, \
255 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
264#define SET_LOCKTAG_OBJECT(locktag,dboid,classoid,objoid,objsubid) \
265 ((locktag).locktag_field1 = (dboid), \
266 (locktag).locktag_field2 = (classoid), \
267 (locktag).locktag_field3 = (objoid), \
268 (locktag).locktag_field4 = (objsubid), \
269 (locktag).locktag_type = LOCKTAG_OBJECT, \
270 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
272#define SET_LOCKTAG_ADVISORY(locktag,id1,id2,id3,id4) \
273 ((locktag).locktag_field1 = (id1), \
274 (locktag).locktag_field2 = (id2), \
275 (locktag).locktag_field3 = (id3), \
276 (locktag).locktag_field4 = (id4), \
277 (locktag).locktag_type = LOCKTAG_ADVISORY, \
278 (locktag).locktag_lockmethodid = USER_LOCKMETHOD)
284#define SET_LOCKTAG_APPLY_TRANSACTION(locktag,dboid,suboid,xid,objid) \
285 ((locktag).locktag_field1 = (dboid), \
286 (locktag).locktag_field2 = (suboid), \
287 (locktag).locktag_field3 = (xid), \
288 (locktag).locktag_field4 = (objid), \
289 (locktag).locktag_type = LOCKTAG_APPLY_TRANSACTION, \
290 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
326#define LOCK_LOCKMETHOD(lock) ((LOCKMETHODID) (lock).tag.locktag_lockmethodid)
327#define LOCK_LOCKTAG(lock) ((LockTagType) (lock).tag.locktag_type)
384#define PROCLOCK_LOCKMETHOD(proclock) \
385 LOCK_LOCKMETHOD(*((proclock).tag.myLock))
445#define LOCALLOCK_LOCKMETHOD(llock) ((llock).tag.lock.locktag_lockmethodid)
446#define LOCALLOCK_LOCKTAG(llock) ((LockTagType) (llock).tag.lock.locktag_type)
526#define LockHashPartition(hashcode) \
527 ((hashcode) % NUM_LOCK_PARTITIONS)
528#define LockHashPartitionLock(hashcode) \
529 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + \
530 LockHashPartition(hashcode)].lock)
531#define LockHashPartitionLockByIndex(i) \
532 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + (i)].lock)
543#define LockHashPartitionLockByProc(leader_pgproc) \
544 LockHashPartitionLock(GetNumberFromPGProc(leader_pgproc))
564 bool reportMemoryError,
566 bool logLockFailure);
570 LOCKMODE lockmode,
bool sessionLock);
576 LOCKMODE lockmode,
bool orstronger);
577#ifdef USE_ASSERT_CHECKING
578extern HTAB *GetLockMethodLocalHash(
void);
581 LOCKMODE lockmode,
bool sessionLock);
622extern void DumpLocks(
PGPROC *proc);
623extern 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
void lock_twophase_postabort(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
void PostPrepare_Locks(FullTransactionId fxid)
void lock_twophase_standby_recover(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
bool DoLockModesConflict(LOCKMODE mode1, LOCKMODE mode2)
struct LOCALLOCK LOCALLOCK
PGDLLIMPORT bool log_lock_failures
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)
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 ResetAwaitedLock(void)
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)
bool LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
struct PROCLOCKTAG PROCLOCKTAG
void lock_twophase_postcommit(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
PGDLLIMPORT const char *const LockTagTypeNames[]
void InitDeadLockChecking(void)
void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks)
LOCALLOCK * GetAwaitedLock(void)
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)
void lock_twophase_recover(FullTransactionId fxid, uint16 info, void *recdata, uint32 len)
pg_noreturn void DeadLockReport(void)
struct LOCALLOCKTAG LOCALLOCKTAG
LockMethod GetLocksMethodTable(const LOCK *lock)
@ 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