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