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