1 /*------------------------------------------------------------------------- 2 * 3 * lmgr.h 4 * POSTGRES lock manager definitions. 5 * 6 * 7 * Portions Copyright (c) 1996-2020, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/storage/lmgr.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef LMGR_H 15 #define LMGR_H 16 17 #include "lib/stringinfo.h" 18 #include "storage/itemptr.h" 19 #include "storage/lock.h" 20 #include "utils/rel.h" 21 22 23 /* XactLockTableWait operations */ 24 typedef enum XLTW_Oper 25 { 26 XLTW_None, 27 XLTW_Update, 28 XLTW_Delete, 29 XLTW_Lock, 30 XLTW_LockUpdated, 31 XLTW_InsertIndex, 32 XLTW_InsertIndexUnique, 33 XLTW_FetchUpdated, 34 XLTW_RecheckExclusionConstr 35 } XLTW_Oper; 36 37 extern void RelationInitLockInfo(Relation relation); 38 39 /* Lock a relation */ 40 extern void LockRelationOid(Oid relid, LOCKMODE lockmode); 41 extern bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode); 42 extern void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode); 43 extern void UnlockRelationOid(Oid relid, LOCKMODE lockmode); 44 45 extern void LockRelation(Relation relation, LOCKMODE lockmode); 46 extern bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode); 47 extern void UnlockRelation(Relation relation, LOCKMODE lockmode); 48 extern bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode, 49 bool orstronger); 50 extern bool LockHasWaitersRelation(Relation relation, LOCKMODE lockmode); 51 52 extern void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode); 53 extern void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode); 54 55 /* Lock a relation for extension */ 56 extern void LockRelationForExtension(Relation relation, LOCKMODE lockmode); 57 extern void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode); 58 extern bool ConditionalLockRelationForExtension(Relation relation, 59 LOCKMODE lockmode); 60 extern int RelationExtensionLockWaiterCount(Relation relation); 61 62 /* Lock to recompute pg_database.datfrozenxid in the current database */ 63 extern void LockDatabaseFrozenIds(LOCKMODE lockmode); 64 65 /* Lock a page (currently only used within indexes) */ 66 extern void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode); 67 extern bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode); 68 extern void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode); 69 70 /* Lock a tuple (see heap_lock_tuple before assuming you understand this) */ 71 extern void LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode); 72 extern bool ConditionalLockTuple(Relation relation, ItemPointer tid, 73 LOCKMODE lockmode); 74 extern void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode); 75 76 /* Lock an XID (used to wait for a transaction to finish) */ 77 extern void XactLockTableInsert(TransactionId xid); 78 extern void XactLockTableDelete(TransactionId xid); 79 extern void XactLockTableWait(TransactionId xid, Relation rel, 80 ItemPointer ctid, XLTW_Oper oper); 81 extern bool ConditionalXactLockTableWait(TransactionId xid); 82 83 /* Lock VXIDs, specified by conflicting locktags */ 84 extern void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode, bool progress); 85 extern void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress); 86 87 /* Lock an XID for tuple insertion (used to wait for an insertion to finish) */ 88 extern uint32 SpeculativeInsertionLockAcquire(TransactionId xid); 89 extern void SpeculativeInsertionLockRelease(TransactionId xid); 90 extern void SpeculativeInsertionWait(TransactionId xid, uint32 token); 91 92 /* Lock a general object (other than a relation) of the current database */ 93 extern void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, 94 LOCKMODE lockmode); 95 extern void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, 96 LOCKMODE lockmode); 97 98 /* Lock a shared-across-databases object (other than a relation) */ 99 extern void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, 100 LOCKMODE lockmode); 101 extern void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, 102 LOCKMODE lockmode); 103 104 extern void LockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, 105 LOCKMODE lockmode); 106 extern void UnlockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, 107 LOCKMODE lockmode); 108 109 /* Describe a locktag for error messages */ 110 extern void DescribeLockTag(StringInfo buf, const LOCKTAG *tag); 111 112 extern const char *GetLockNameFromTagType(uint16 locktag_type); 113 114 #endif /* LMGR_H */ 115