1 /*-------------------------------------------------------------------------
4 * POSTGRES lock manager definitions.
7 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * src/include/storage/lmgr.h
12 *-------------------------------------------------------------------------
17 #include "lib/stringinfo.h"
18 #include "storage/itemptr.h"
19 #include "storage/lock.h"
20 #include "utils/rel.h"
23 /* XactLockTableWait operations */
24 typedef enum XLTW_Oper
32 XLTW_InsertIndexUnique
,
34 XLTW_RecheckExclusionConstr
37 extern void RelationInitLockInfo(Relation relation
);
40 extern void LockRelationOid(Oid relid
, LOCKMODE lockmode
);
41 extern void LockRelationId(LockRelId
*relid
, LOCKMODE lockmode
);
42 extern bool ConditionalLockRelationOid(Oid relid
, LOCKMODE lockmode
);
43 extern void UnlockRelationId(LockRelId
*relid
, LOCKMODE lockmode
);
44 extern void UnlockRelationOid(Oid relid
, LOCKMODE lockmode
);
46 extern void LockRelation(Relation relation
, LOCKMODE lockmode
);
47 extern bool ConditionalLockRelation(Relation relation
, LOCKMODE lockmode
);
48 extern void UnlockRelation(Relation relation
, LOCKMODE lockmode
);
49 extern bool CheckRelationLockedByMe(Relation relation
, LOCKMODE lockmode
,
51 extern bool LockHasWaitersRelation(Relation relation
, LOCKMODE lockmode
);
53 extern void LockRelationIdForSession(LockRelId
*relid
, LOCKMODE lockmode
);
54 extern void UnlockRelationIdForSession(LockRelId
*relid
, LOCKMODE lockmode
);
56 /* Lock a relation for extension */
57 extern void LockRelationForExtension(Relation relation
, LOCKMODE lockmode
);
58 extern void UnlockRelationForExtension(Relation relation
, LOCKMODE lockmode
);
59 extern bool ConditionalLockRelationForExtension(Relation relation
,
61 extern int RelationExtensionLockWaiterCount(Relation relation
);
63 /* Lock to recompute pg_database.datfrozenxid in the current database */
64 extern void LockDatabaseFrozenIds(LOCKMODE lockmode
);
66 /* Lock a page (currently only used within indexes) */
67 extern void LockPage(Relation relation
, BlockNumber blkno
, LOCKMODE lockmode
);
68 extern bool ConditionalLockPage(Relation relation
, BlockNumber blkno
, LOCKMODE lockmode
);
69 extern void UnlockPage(Relation relation
, BlockNumber blkno
, LOCKMODE lockmode
);
71 /* Lock a tuple (see heap_lock_tuple before assuming you understand this) */
72 extern void LockTuple(Relation relation
, ItemPointer tid
, LOCKMODE lockmode
);
73 extern bool ConditionalLockTuple(Relation relation
, ItemPointer tid
,
75 extern void UnlockTuple(Relation relation
, ItemPointer tid
, LOCKMODE lockmode
);
77 /* Lock an XID (used to wait for a transaction to finish) */
78 extern void XactLockTableInsert(TransactionId xid
);
79 extern void XactLockTableDelete(TransactionId xid
);
80 extern void XactLockTableWait(TransactionId xid
, Relation rel
,
81 ItemPointer ctid
, XLTW_Oper oper
);
82 extern bool ConditionalXactLockTableWait(TransactionId xid
);
84 /* Lock VXIDs, specified by conflicting locktags */
85 extern void WaitForLockers(LOCKTAG heaplocktag
, LOCKMODE lockmode
, bool progress
);
86 extern void WaitForLockersMultiple(List
*locktags
, LOCKMODE lockmode
, bool progress
);
88 /* Lock an XID for tuple insertion (used to wait for an insertion to finish) */
89 extern uint32
SpeculativeInsertionLockAcquire(TransactionId xid
);
90 extern void SpeculativeInsertionLockRelease(TransactionId xid
);
91 extern void SpeculativeInsertionWait(TransactionId xid
, uint32 token
);
93 /* Lock a general object (other than a relation) of the current database */
94 extern void LockDatabaseObject(Oid classid
, Oid objid
, uint16 objsubid
,
96 extern void UnlockDatabaseObject(Oid classid
, Oid objid
, uint16 objsubid
,
99 /* Lock a shared-across-databases object (other than a relation) */
100 extern void LockSharedObject(Oid classid
, Oid objid
, uint16 objsubid
,
102 extern void UnlockSharedObject(Oid classid
, Oid objid
, uint16 objsubid
,
105 extern void LockSharedObjectForSession(Oid classid
, Oid objid
, uint16 objsubid
,
107 extern void UnlockSharedObjectForSession(Oid classid
, Oid objid
, uint16 objsubid
,
110 /* Describe a locktag for error messages */
111 extern void DescribeLockTag(StringInfo buf
, const LOCKTAG
*tag
);
113 extern const char *GetLockNameFromTagType(uint16 locktag_type
);