Fix a few errors in comments. Patch by Fujii Masao, plus the one in
[PostgreSQL.git] / src / include / storage / bufmgr.h
blobd06eb774ff8f417f5398ccd907098f18efdac3ed
1 /*-------------------------------------------------------------------------
3 * bufmgr.h
4 * POSTGRES buffer manager definitions.
7 * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * $PostgreSQL$
12 *-------------------------------------------------------------------------
14 #ifndef BUFMGR_H
15 #define BUFMGR_H
17 #include "storage/block.h"
18 #include "storage/buf.h"
19 #include "storage/bufpage.h"
20 #include "storage/relfilenode.h"
21 #include "utils/relcache.h"
23 typedef void *Block;
25 /* Possible arguments for GetAccessStrategy() */
26 typedef enum BufferAccessStrategyType
28 BAS_NORMAL, /* Normal random access */
29 BAS_BULKREAD, /* Large read-only scan (hint bit updates are
30 * ok) */
31 BAS_BULKWRITE, /* Large multi-block write (e.g. COPY IN) */
32 BAS_VACUUM /* VACUUM */
33 } BufferAccessStrategyType;
35 /* Possible modes for ReadBufferExtended() */
36 typedef enum
38 RBM_NORMAL, /* Normal read */
39 RBM_ZERO, /* Don't read from disk, caller will
40 * initialize */
41 RBM_ZERO_ON_ERROR /* Read, but return an all-zeros page on error */
42 } ReadBufferMode;
44 /* in globals.c ... this duplicates miscadmin.h */
45 extern PGDLLIMPORT int NBuffers;
47 /* in bufmgr.c */
48 extern bool zero_damaged_pages;
49 extern int bgwriter_lru_maxpages;
50 extern double bgwriter_lru_multiplier;
51 extern int target_prefetch_pages;
53 /* in buf_init.c */
54 extern PGDLLIMPORT char *BufferBlocks;
55 extern PGDLLIMPORT int32 *PrivateRefCount;
57 /* in localbuf.c */
58 extern PGDLLIMPORT int NLocBuffer;
59 extern PGDLLIMPORT Block *LocalBufferBlockPointers;
60 extern PGDLLIMPORT int32 *LocalRefCount;
62 /* special block number for ReadBuffer() */
63 #define P_NEW InvalidBlockNumber /* grow the file to get a new page */
66 * Buffer content lock modes (mode argument for LockBuffer())
68 #define BUFFER_LOCK_UNLOCK 0
69 #define BUFFER_LOCK_SHARE 1
70 #define BUFFER_LOCK_EXCLUSIVE 2
73 * These routines are beaten on quite heavily, hence the macroization.
77 * BufferIsValid
78 * True iff the given buffer number is valid (either as a shared
79 * or local buffer).
81 * This is not quite the inverse of the BufferIsInvalid() macro, since this
82 * adds sanity rangechecks on the buffer number.
84 * Note: For a long time this was defined the same as BufferIsPinned,
85 * that is it would say False if you didn't hold a pin on the buffer.
86 * I believe this was bogus and served only to mask logic errors.
87 * Code should always know whether it has a buffer reference,
88 * independently of the pin state.
90 #define BufferIsValid(bufnum) \
91 ( \
92 (bufnum) != InvalidBuffer && \
93 (bufnum) >= -NLocBuffer && \
94 (bufnum) <= NBuffers \
98 * BufferIsPinned
99 * True iff the buffer is pinned (also checks for valid buffer number).
101 * NOTE: what we check here is that *this* backend holds a pin on
102 * the buffer. We do not care whether some other backend does.
104 #define BufferIsPinned(bufnum) \
106 !BufferIsValid(bufnum) ? \
107 false \
109 BufferIsLocal(bufnum) ? \
110 (LocalRefCount[-(bufnum) - 1] > 0) \
112 (PrivateRefCount[(bufnum) - 1] > 0) \
116 * BufferGetBlock
117 * Returns a reference to a disk page image associated with a buffer.
119 * Note:
120 * Assumes buffer is valid.
122 #define BufferGetBlock(buffer) \
124 AssertMacro(BufferIsValid(buffer)), \
125 BufferIsLocal(buffer) ? \
126 LocalBufferBlockPointers[-(buffer) - 1] \
128 (Block) (BufferBlocks + ((Size) ((buffer) - 1)) * BLCKSZ) \
132 * BufferGetPageSize
133 * Returns the page size within a buffer.
135 * Notes:
136 * Assumes buffer is valid.
138 * The buffer can be a raw disk block and need not contain a valid
139 * (formatted) disk page.
141 /* XXX should dig out of buffer descriptor */
142 #define BufferGetPageSize(buffer) \
144 AssertMacro(BufferIsValid(buffer)), \
145 (Size)BLCKSZ \
149 * BufferGetPage
150 * Returns the page associated with a buffer.
152 #define BufferGetPage(buffer) ((Page)BufferGetBlock(buffer))
155 * prototypes for functions in bufmgr.c
157 extern void PrefetchBuffer(Relation reln, ForkNumber forkNum,
158 BlockNumber blockNum);
159 extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);
160 extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum,
161 BlockNumber blockNum, ReadBufferMode mode,
162 BufferAccessStrategy strategy);
163 extern Buffer ReadBufferWithoutRelcache(RelFileNode rnode, bool isTemp,
164 ForkNumber forkNum, BlockNumber blockNum,
165 ReadBufferMode mode, BufferAccessStrategy strategy);
166 extern void ReleaseBuffer(Buffer buffer);
167 extern void UnlockReleaseBuffer(Buffer buffer);
168 extern void MarkBufferDirty(Buffer buffer);
169 extern void IncrBufferRefCount(Buffer buffer);
170 extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,
171 BlockNumber blockNum);
173 extern void InitBufferPool(void);
174 extern void InitBufferPoolAccess(void);
175 extern void InitBufferPoolBackend(void);
176 extern char *ShowBufferUsage(void);
177 extern void ResetBufferUsage(void);
178 extern void AtEOXact_Buffers(bool isCommit);
179 extern void PrintBufferLeakWarning(Buffer buffer);
180 extern void CheckPointBuffers(int flags);
181 extern BlockNumber BufferGetBlockNumber(Buffer buffer);
182 extern BlockNumber RelationGetNumberOfBlocks(Relation relation);
183 extern void FlushRelationBuffers(Relation rel);
184 extern void FlushDatabaseBuffers(Oid dbid);
185 extern void DropRelFileNodeBuffers(RelFileNode rnode, ForkNumber forkNum,
186 bool istemp, BlockNumber firstDelBlock);
187 extern void DropDatabaseBuffers(Oid dbid);
189 #ifdef NOT_USED
190 extern void PrintPinnedBufs(void);
191 #endif
192 extern Size BufferShmemSize(void);
193 extern void BufferGetTag(Buffer buffer, RelFileNode *rnode,
194 ForkNumber *forknum, BlockNumber *blknum);
196 extern void SetBufferCommitInfoNeedsSave(Buffer buffer);
198 extern void UnlockBuffers(void);
199 extern void LockBuffer(Buffer buffer, int mode);
200 extern bool ConditionalLockBuffer(Buffer buffer);
201 extern void LockBufferForCleanup(Buffer buffer);
202 extern bool ConditionalLockBufferForCleanup(Buffer buffer);
204 extern void AbortBufferIO(void);
206 extern void BufmgrCommit(void);
207 extern void BgBufferSync(void);
209 extern void AtProcExit_LocalBuffers(void);
211 /* in freelist.c */
212 extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype);
213 extern void FreeAccessStrategy(BufferAccessStrategy strategy);
215 #endif