18 #error "lock.h may not be included from frontend code"
40 extern int Trace_lock_oidmin;
41 extern bool Trace_locks;
42 extern bool Trace_userlocks;
43 extern int Trace_lock_table;
44 extern bool Debug_deadlocks;
70 #define InvalidLocalTransactionId 0
71 #define LocalTransactionIdIsValid(lxid) ((lxid) != InvalidLocalTransactionId)
72 #define VirtualTransactionIdIsValid(vxid) \
73 (((vxid).backendId != InvalidBackendId) && \
74 LocalTransactionIdIsValid((vxid).localTransactionId))
75 #define VirtualTransactionIdEquals(vxid1, vxid2) \
76 ((vxid1).backendId == (vxid2).backendId && \
77 (vxid1).localTransactionId == (vxid2).localTransactionId)
78 #define SetInvalidVirtualTransactionId(vxid) \
79 ((vxid).backendId = InvalidBackendId, \
80 (vxid).localTransactionId = InvalidLocalTransactionId)
81 #define GET_VXID_FROM_PGPROC(vxid, proc) \
82 ((vxid).backendId = (proc).backendId, \
83 (vxid).localTransactionId = (proc).lxid)
86 #define MAX_LOCKMODES 10
88 #define LOCKBIT_ON(lockmode) (1 << (lockmode))
89 #define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))
129 #define DEFAULT_LOCKMETHOD 1
130 #define USER_LOCKMETHOD 2
167 #define LOCKTAG_LAST_TYPE LOCKTAG_ADVISORY
194 #define SET_LOCKTAG_RELATION(locktag,dboid,reloid) \
195 ((locktag).locktag_field1 = (dboid), \
196 (locktag).locktag_field2 = (reloid), \
197 (locktag).locktag_field3 = 0, \
198 (locktag).locktag_field4 = 0, \
199 (locktag).locktag_type = LOCKTAG_RELATION, \
200 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
202 #define SET_LOCKTAG_RELATION_EXTEND(locktag,dboid,reloid) \
203 ((locktag).locktag_field1 = (dboid), \
204 (locktag).locktag_field2 = (reloid), \
205 (locktag).locktag_field3 = 0, \
206 (locktag).locktag_field4 = 0, \
207 (locktag).locktag_type = LOCKTAG_RELATION_EXTEND, \
208 (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)
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)
226 #define SET_LOCKTAG_TRANSACTION(locktag,xid) \
227 ((locktag).locktag_field1 = (xid), \
228 (locktag).locktag_field2 = 0, \
229 (locktag).locktag_field3 = 0, \
230 (locktag).locktag_field4 = 0, \
231 (locktag).locktag_type = LOCKTAG_TRANSACTION, \
232 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
234 #define SET_LOCKTAG_VIRTUALTRANSACTION(locktag,vxid) \
235 ((locktag).locktag_field1 = (vxid).backendId, \
236 (locktag).locktag_field2 = (vxid).localTransactionId, \
237 (locktag).locktag_field3 = 0, \
238 (locktag).locktag_field4 = 0, \
239 (locktag).locktag_type = LOCKTAG_VIRTUALTRANSACTION, \
240 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
242 #define SET_LOCKTAG_SPECULATIVE_INSERTION(locktag,xid,token) \
243 ((locktag).locktag_field1 = (xid), \
244 (locktag).locktag_field2 = (token), \
245 (locktag).locktag_field3 = 0, \
246 (locktag).locktag_field4 = 0, \
247 (locktag).locktag_type = LOCKTAG_SPECULATIVE_TOKEN, \
248 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
250 #define SET_LOCKTAG_OBJECT(locktag,dboid,classoid,objoid,objsubid) \
251 ((locktag).locktag_field1 = (dboid), \
252 (locktag).locktag_field2 = (classoid), \
253 (locktag).locktag_field3 = (objoid), \
254 (locktag).locktag_field4 = (objsubid), \
255 (locktag).locktag_type = LOCKTAG_OBJECT, \
256 (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)
258 #define SET_LOCKTAG_ADVISORY(locktag,id1,id2,id3,id4) \
259 ((locktag).locktag_field1 = (id1), \
260 (locktag).locktag_field2 = (id2), \
261 (locktag).locktag_field3 = (id3), \
262 (locktag).locktag_field4 = (id4), \
263 (locktag).locktag_type = LOCKTAG_ADVISORY, \
264 (locktag).locktag_lockmethodid = USER_LOCKMETHOD)
301 #define LOCK_LOCKMETHOD(lock) ((LOCKMETHODID) (lock).tag.locktag_lockmethodid)
358 #define PROCLOCK_LOCKMETHOD(proclock) \
359 LOCK_LOCKMETHOD(*((proclock).tag.myLock))
418 #define LOCALLOCK_LOCKMETHOD(llock) ((llock).tag.lock.locktag_lockmethodid)
496 #define LockHashPartition(hashcode) \
497 ((hashcode) % NUM_LOCK_PARTITIONS)
498 #define LockHashPartitionLock(hashcode) \
499 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + \
500 LockHashPartition(hashcode)].lock)
501 #define LockHashPartitionLockByIndex(i) \
502 (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + (i)].lock)
513 #define LockHashPartitionLockByProc(leader_pgproc) \
514 LockHashPartitionLock((leader_pgproc)->pgprocno)
532 bool report_memory_error);
535 LOCKMODE lockmode,
bool sessionLock);
541 LOCKMODE lockmode,
bool sessionLock);
560 void *recdata,
uint32 len);
562 void *recdata,
uint32 len);
564 void *recdata,
uint32 len);
566 void *recdata,
uint32 len);
580 extern void DumpLocks(
PGPROC *proc);
581 extern void DumpAllLocks(
void);
struct BlockedProcData BlockedProcData
const char *const LockTagTypeNames[]
void VirtualXactLockTableInsert(VirtualTransactionId vxid)
VirtualTransactionId * GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode)
bool holdsStrongLockCount
void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode)
void AbortStrongLockAcquire(void)
void lock_twophase_postcommit(TransactionId xid, uint16 info, void *recdata, uint32 len)
void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks)
LockMethod GetLocksMethodTable(const LOCK *lock)
struct LOCALLOCKOWNER LOCALLOCKOWNER
void PostPrepare_Locks(TransactionId xid)
const LOCKMASK * conflictTab
int LockWaiterCount(const LOCKTAG *locktag)
void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks)
LockMethod GetLockTagsMethodTable(const LOCKTAG *locktag)
#define pg_attribute_noreturn()
LocalTransactionId localTransactionId
struct LOCALLOCKTAG LOCALLOCKTAG
void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks)
void DeadLockReport(void) pg_attribute_noreturn()
BlockedProcsData * GetBlockerStatusData(int blocked_pid)
LockAcquireResult LockAcquireExtended(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait, bool report_memory_error)
struct LOCALLOCK LOCALLOCK
struct BlockedProcsData BlockedProcsData
void lock_twophase_postabort(TransactionId xid, uint16 info, void *recdata, uint32 len)
LockAcquireResult LockAcquire(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock, bool dontWait)
void VirtualXactLockTableCleanup(void)
const char * GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode)
int granted[MAX_LOCKMODES]
uint32 LocalTransactionId
xl_standby_lock * GetRunningTransactionLocks(int *nlocks)
int requested[MAX_LOCKMODES]
struct PROCLOCKTAG PROCLOCKTAG
const LockMethodData * LockMethod
bool LockRelease(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
bool LockHasWaiters(const LOCKTAG *locktag, LOCKMODE lockmode, bool sessionLock)
void RememberSimpleDeadLock(PGPROC *proc1, LOCKMODE lockmode, LOCK *lock, PGPROC *proc2)
DeadLockState DeadLockCheck(PGPROC *proc)
void lock_twophase_recover(TransactionId xid, uint16 info, void *recdata, uint32 len)
void GrantAwaitedLock(void)
bool DoLockModesConflict(LOCKMODE mode1, LOCKMODE mode2)
bool VirtualXactLock(VirtualTransactionId vxid, bool wait)
LOCALLOCKOWNER * lockOwners
struct LockMethodData LockMethodData
uint8 locktag_lockmethodid
int LockCheckConflicts(LockMethod lockMethodTable, LOCKMODE lockmode, LOCK *lock, PROCLOCK *proclock)
struct PROC_QUEUE PROC_QUEUE
void InitDeadLockChecking(void)
struct LockInstanceData LockInstanceData
LockData * GetLockStatusData(void)
struct ResourceOwnerData * owner
void lock_twophase_standby_recover(TransactionId xid, uint16 info, void *recdata, uint32 len)
PGPROC * GetBlockingAutoVacuumPgproc(void)
void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode)
uint32 LockTagHashCode(const LOCKTAG *locktag)
void AtPrepare_Locks(void)
const char *const * lockModeNames
void LockReleaseSession(LOCKMETHODID lockmethodid)