1 /*------------------------------------------------------------------------- 2 * 3 * lmgr.h 4 * POSTGRES lock manager definitions. 5 * 6 * 7 * Portions Copyright (c) 1996-2017, 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 LockHasWaitersRelation(Relation relation, LOCKMODE lockmode); 49 50 extern void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode); 51 extern void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode); 52 53 /* Lock a relation for extension */ 54 extern void LockRelationForExtension(Relation relation, LOCKMODE lockmode); 55 extern void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode); 56 extern bool ConditionalLockRelationForExtension(Relation relation, 57 LOCKMODE lockmode); 58 extern int RelationExtensionLockWaiterCount(Relation relation); 59 60 /* Lock to recompute pg_database.datfrozenxid in the current database */ 61 extern void LockDatabaseFrozenIds(LOCKMODE lockmode); 62 63 /* Lock a page (currently only used within indexes) */ 64 extern void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode); 65 extern bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode); 66 extern void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode); 67 68 /* Lock a tuple (see heap_lock_tuple before assuming you understand this) */ 69 extern void LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode); 70 extern bool ConditionalLockTuple(Relation relation, ItemPointer tid, 71 LOCKMODE lockmode); 72 extern void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode); 73 74 /* Lock an XID (used to wait for a transaction to finish) */ 75 extern void XactLockTableInsert(TransactionId xid); 76 extern void XactLockTableDelete(TransactionId xid); 77 extern void XactLockTableWait(TransactionId xid, Relation rel, 78 ItemPointer ctid, XLTW_Oper oper); 79 extern bool ConditionalXactLockTableWait(TransactionId xid); 80 81 /* Lock VXIDs, specified by conflicting locktags */ 82 extern void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode); 83 extern void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode); 84 85 /* Lock an XID for tuple insertion (used to wait for an insertion to finish) */ 86 extern uint32 SpeculativeInsertionLockAcquire(TransactionId xid); 87 extern void SpeculativeInsertionLockRelease(TransactionId xid); 88 extern void SpeculativeInsertionWait(TransactionId xid, uint32 token); 89 90 /* Lock a general object (other than a relation) of the current database */ 91 extern void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, 92 LOCKMODE lockmode); 93 extern void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, 94 LOCKMODE lockmode); 95 96 /* Lock a shared-across-databases object (other than a relation) */ 97 extern void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, 98 LOCKMODE lockmode); 99 extern void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, 100 LOCKMODE lockmode); 101 102 extern void LockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, 103 LOCKMODE lockmode); 104 extern void UnlockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid, 105 LOCKMODE lockmode); 106 107 /* Describe a locktag for error messages */ 108 extern void DescribeLockTag(StringInfo buf, const LOCKTAG *tag); 109 110 extern const char *GetLockNameFromTagType(uint16 locktag_type); 111 112 #endif /* LMGR_H */ 113