18 #error "lock.h may not be included from frontend code"
70 #define InvalidLocalTransactionId 0
71 #define LocalTransactionIdIsValid(lxid) ((lxid) != InvalidLocalTransactionId)
72 #define VirtualTransactionIdIsValid(vxid) \
73 (LocalTransactionIdIsValid((vxid).localTransactionId))
74 #define VirtualTransactionIdIsRecoveredPreparedXact(vxid) \
75 ((vxid).backendId == InvalidBackendId)
76 #define VirtualTransactionIdEquals(vxid1, vxid2) \
77 ((vxid1).backendId == (vxid2).backendId && \
78 (vxid1).localTransactionId == (vxid2).localTransactionId)
79 #define SetInvalidVirtualTransactionId(vxid) \
80 ((vxid).backendId = InvalidBackendId, \
81 (vxid).localTransactionId = InvalidLocalTransactionId)
82 #define GET_VXID_FROM_PGPROC(vxid, proc) \
83 ((vxid).backendId = (proc).backendId, \
84 (vxid).localTransactionId = (proc).lxid)
87 #define MAX_LOCKMODES 10
89 #define LOCKBIT_ON(lockmode) (1 << (lockmode))
90 #define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
130 #define DEFAULT_LOCKMETHOD 1
131 #define USER_LOCKMETHOD 2
155 #define LOCKTAG_LAST_TYPE LOCKTAG_ADVISORY
184 #define SET_LOCKTAG_RELATION(locktag,dboid,reloid) \
185 ((locktag).locktag_field1 = (dboid), \
186 (locktag).locktag_field2 = (reloid), \
187 (locktag).locktag_field3 = 0, \
188 (locktag).locktag_field4 = 0, \
189 (locktag).locktag_type = LOCKTAG_RELATION, \
190 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
193 #define SET_LOCKTAG_RELATION_EXTEND(locktag,dboid,reloid) \
194 ((locktag).locktag_field1 = (dboid), \
195 (locktag).locktag_field2 = (reloid), \
196 (locktag).locktag_field3 = 0, \
197 (locktag).locktag_field4 = 0, \
198 (locktag).locktag_type = LOCKTAG_RELATION_EXTEND, \
199 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
202 #define SET_LOCKTAG_DATABASE_FROZEN_IDS(locktag,dboid) \
203 ((locktag).locktag_field1 = (dboid), \
204 (locktag).locktag_field2 = 0, \
205 (locktag).locktag_field3 = 0, \
206 (locktag).locktag_field4 = 0, \
207 (locktag).locktag_type = LOCKTAG_DATABASE_FROZEN_IDS, \
208 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
211 #define SET_LOCKTAG_PAGE(locktag,dboid,reloid,blocknum) \
212 ((locktag).locktag_field1 = (dboid), \
213 (locktag).locktag_field2 = (reloid), \
214 (locktag).locktag_field3 = (blocknum), \
215 (locktag).locktag_field4 = 0, \
216 (locktag).locktag_type = LOCKTAG_PAGE, \
217 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
220 #define SET_LOCKTAG_TUPLE(locktag,dboid,reloid,blocknum,offnum) \
221 ((locktag).locktag_field1 = (dboid), \
222 (locktag).locktag_field2 = (reloid), \
223 (locktag).locktag_field3 = (blocknum), \
224 (locktag).locktag_field4 = (offnum), \
225 (locktag).locktag_type = LOCKTAG_TUPLE, \
226 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
229 #define SET_LOCKTAG_TRANSACTION(locktag,xid) \
230 ((locktag).locktag_field1 = (xid), \
231 (locktag).locktag_field2 = 0, \
232 (locktag).locktag_field3 = 0, \
233 (locktag).locktag_field4 = 0, \
234 (locktag).locktag_type = LOCKTAG_TRANSACTION, \
235 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
238 #define SET_LOCKTAG_VIRTUALTRANSACTION(locktag,vxid) \
239 ((locktag).locktag_field1 = (vxid).backendId, \
240 (locktag).locktag_field2 = (vxid).localTransactionId, \
241 (locktag).locktag_field3 = 0, \
242 (locktag).locktag_field4 = 0, \
243 (locktag).locktag_type = LOCKTAG_VIRTUALTRANSACTION, \
244 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
250 #define SET_LOCKTAG_SPECULATIVE_INSERTION(locktag,xid,token) \
251 ((locktag).locktag_field1 = (xid), \
252 (locktag).locktag_field2 = (token), \
253 (locktag).locktag_field3 = 0, \
254 (locktag).locktag_field4 = 0, \
255 (locktag).locktag_type = LOCKTAG_SPECULATIVE_TOKEN, \
256 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
265 #define SET_LOCKTAG_OBJECT(locktag,dboid,classoid,objoid,objsubid) \
266 ((locktag).locktag_field1 = (dboid), \
267 (locktag).locktag_field2 = (classoid), \
268 (locktag).locktag_field3 = (objoid), \
269 (locktag).locktag_field4 = (objsubid), \
270 (locktag).locktag_type = LOCKTAG_OBJECT, \
271 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
273 #define SET_LOCKTAG_ADVISORY(locktag,id1,id2,id3,id4) \
274 ((locktag).locktag_field1 = (id1), \
275 (locktag).locktag_field2 = (id2), \
276 (locktag).locktag_field3 = (id3), \
277 (locktag).locktag_field4 = (id4), \
278 (locktag).locktag_type = LOCKTAG_ADVISORY, \
279 (locktag).locktag_lockmethodid = USER_LOCKMETHOD)
316 #define LOCK_LOCKMETHOD(lock) ((LOCKMETHODID) (lock).tag.locktag_lockmethodid)
317 #define LOCK_LOCKTAG(lock) ((LockTagType) (lock).tag.locktag_type)
374 #define PROCLOCK_LOCKMETHOD(proclock) \
375 LOCK_LOCKMETHOD(*((proclock).tag.myLock))
435 #define LOCALLOCK_LOCKMETHOD(llock) ((llock).tag.lock.locktag_lockmethodid)
436 #define LOCALLOCK_LOCKTAG(llock) ((LockTagType) (llock).tag.lock.locktag_type)
517 #define LockHashPartition(hashcode) \
518 ((hashcode) % NUM_LOCK_PARTITIONS)
519 #define LockHashPartitionLock(hashcode) \
520 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + \
521 LockHashPartition(hashcode)].lock)
522 #define LockHashPartitionLockByIndex(i) \
523 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + (i)].lock)
534 #define LockHashPartitionLockByProc(leader_pgproc) \
535 LockHashPartitionLock((leader_pgproc)->pgprocno)
553 bool reportMemoryError,
558 LOCKMODE lockmode,
bool sessionLock);
564 #ifdef USE_ASSERT_CHECKING
565 extern HTAB *GetLockMethodLocalHash(
void);
568 LOCKMODE lockmode,
bool sessionLock);
607 extern void DumpLocks(
PGPROC *proc);
608 extern void DumpAllLocks(
void);
#define pg_attribute_noreturn()
uint32 LocalTransactionId
LockAcquireResult LockAcquire(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait)
LockAcquireResult LockAcquireExtended(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait, bool reportMemoryError, LOCALLOCK **locallockp)
VirtualTransactionId * GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp)
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)
xl_standby_lock * GetRunningTransactionLocks(int *nlocks)
@ LOCKTAG_RELATION_EXTEND
@ LOCKTAG_SPECULATIVE_TOKEN
@ LOCKTAG_DATABASE_FROZEN_IDS
@ LOCKTAG_VIRTUALTRANSACTION
void GrantAwaitedLock(void)
int LockWaiterCount(const LOCKTAG *locktag)
bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode)
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)
struct PROC_QUEUE PROC_QUEUE
void RememberSimpleDeadLock(PGPROC *proc1, LOCKMODE lockmode, LOCK *lock, PGPROC *proc2)
struct LOCALLOCKOWNER LOCALLOCKOWNER
void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode)
void VirtualXactLockTableCleanup(void)
BlockedProcsData * GetBlockerStatusData(int blocked_pid)
bool VirtualXactLock(VirtualTransactionId vxid, bool wait)
void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode)
void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
struct LockMethodData LockMethodData
void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks)
struct BlockedProcData BlockedProcData
LockData * GetLockStatusData(void)
void AbortStrongLockAcquire(void)
@ DS_BLOCKED_BY_AUTOVACUUM
struct LockInstanceData LockInstanceData
void lock_twophase_postabort(TransactionId xid, uint16 info, void *recdata, uint32 len)
bool LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
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)
void lock_twophase_recover(TransactionId xid, uint16 info, void *recdata, uint32 len)
void LockReleaseSession(LOCKMETHODID lockmethodid)
void MarkLockClear(LOCALLOCK *locallock)
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
DeadLockState DeadLockCheck(PGPROC *proc)
void DeadLockReport(void) pg_attribute_noreturn()
uint32 LockTagHashCode(const LOCKTAG *locktag)
bool LockCheckConflicts(LockMethod lockMethodTable, LOCKMODE lockmode, LOCK *lock, PROCLOCK *proclock)
struct LOCALLOCKTAG LOCALLOCKTAG
LockMethod GetLocksMethodTable(const LOCK *lock)
void PostPrepare_Locks(TransactionId xid)
@ LOCKACQUIRE_ALREADY_CLEAR
@ LOCKACQUIRE_ALREADY_HELD
struct BlockedProcsData BlockedProcsData
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]
const LOCKMASK * conflictTab
const char *const * lockModeNames
LocalTransactionId localTransactionId