15 #ifndef BUFMGR_INTERNALS_H
16 #define BUFMGR_INTERNALS_H
41 #define BUF_REFCOUNT_ONE 1
42 #define BUF_REFCOUNT_MASK ((1U << 18) - 1)
43 #define BUF_USAGECOUNT_MASK 0x003C0000U
44 #define BUF_USAGECOUNT_ONE (1U << 18)
45 #define BUF_USAGECOUNT_SHIFT 18
46 #define BUF_FLAG_MASK 0xFFC00000U
49 #define BUF_STATE_GET_REFCOUNT(state) ((state) & BUF_REFCOUNT_MASK)
50 #define BUF_STATE_GET_USAGECOUNT(state) (((state) & BUF_USAGECOUNT_MASK) >> BUF_USAGECOUNT_SHIFT)
58 #define BM_LOCKED (1U << 22)
59 #define BM_DIRTY (1U << 23)
60 #define BM_VALID (1U << 24)
61 #define BM_TAG_VALID (1U << 25)
62 #define BM_IO_IN_PROGRESS (1U << 26)
63 #define BM_IO_ERROR (1U << 27)
64 #define BM_JUST_DIRTIED (1U << 28)
65 #define BM_PIN_COUNT_WAITER (1U << 29)
66 #define BM_CHECKPOINT_NEEDED (1U << 30)
67 #define BM_PERMANENT (1U << 31)
77 #define BM_MAX_USAGE_COUNT 5
98 #define CLEAR_BUFFERTAG(a) \
100 (a).rnode.spcNode = InvalidOid, \
101 (a).rnode.dbNode = InvalidOid, \
102 (a).rnode.relNode = InvalidOid, \
103 (a).forkNum = InvalidForkNumber, \
104 (a).blockNum = InvalidBlockNumber \
107 #define INIT_BUFFERTAG(a,xx_rnode,xx_forkNum,xx_blockNum) \
109 (a).rnode = (xx_rnode), \
110 (a).forkNum = (xx_forkNum), \
111 (a).blockNum = (xx_blockNum) \
114 #define BUFFERTAGS_EQUAL(a,b) \
116 RelFileNodeEquals((a).rnode, (b).rnode) && \
117 (a).blockNum == (b).blockNum && \
118 (a).forkNum == (b).forkNum \
127 #define BufTableHashPartition(hashcode) \
128 ((hashcode) % NUM_BUFFER_PARTITIONS)
129 #define BufMappingPartitionLock(hashcode) \
130 (&MainLWLockArray[BUFFER_MAPPING_LWLOCK_OFFSET + \
131 BufTableHashPartition(hashcode)].lock)
132 #define BufMappingPartitionLockByIndex(i) \
133 (&MainLWLockArray[BUFFER_MAPPING_LWLOCK_OFFSET + (i)].lock)
211 #define BUFFERDESC_PAD_TO_SIZE (SIZEOF_VOID_P == 8 ? 64 : 1)
219 #define GetBufferDescriptor(id) (&BufferDescriptors[(id)].bufferdesc)
220 #define GetLocalBufferDescriptor(id) (&LocalBufferDescriptors[(id)])
222 #define BufferDescriptorGetBuffer(bdesc) ((bdesc)->buf_id + 1)
224 #define BufferDescriptorGetIOLock(bdesc) \
225 (&(BufferIOLWLockArray[(bdesc)->buf_id]).lock)
226 #define BufferDescriptorGetContentLock(bdesc) \
227 ((LWLock*) (&(bdesc)->content_lock))
235 #define FREENEXT_END_OF_LIST (-1)
236 #define FREENEXT_NOT_IN_LIST (-2)
243 #define UnlockBufHdr(desc, s) \
245 pg_write_barrier(); \
246 pg_atomic_write_u32(&(desc)->state, (s) & (~BM_LOCKED)); \
void DropRelFileNodeLocalBuffers(RelFileNode rnode, ForkNumber forkNum, BlockNumber firstDelBlock)
BufferDesc * LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, bool *foundPtr)
int BufTableLookup(BufferTag *tagPtr, uint32 hashcode)
void ScheduleBufferTagForWriteback(WritebackContext *context, BufferTag *tag)
void InitBufTable(int size)
void LocalPrefetchBuffer(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum)
Size BufTableShmemSize(int size)
uint32 BufTableHashCode(BufferTag *tagPtr)
void StrategyInitialize(bool init)
union BufferDescPadded BufferDescPadded
void IssuePendingWritebacks(WritebackContext *context)
struct BufferDesc BufferDesc
#define BUFFERDESC_PAD_TO_SIZE
PGDLLIMPORT WritebackContext BackendWritebackContext
void AtEOXact_LocalBuffers(bool isCommit)
Size StrategyShmemSize(void)
void BufTableDelete(BufferTag *tagPtr, uint32 hashcode)
PendingWriteback pending_writebacks[WRITEBACK_MAX_PENDING_FLUSHES]
void WritebackContextInit(WritebackContext *context, int *max_coalesce)
#define WRITEBACK_MAX_PENDING_FLUSHES
void MarkLocalBufferDirty(Buffer buffer)
uint32 LockBufHdr(BufferDesc *desc)
int BufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id)
BufferDesc * StrategyGetBuffer(BufferAccessStrategy strategy, uint32 *buf_state)
struct PendingWriteback PendingWriteback
CkptSortItem * CkptBufferIds
PGDLLIMPORT BufferDescPadded * BufferDescriptors
PGDLLIMPORT LWLockMinimallyPadded * BufferIOLWLockArray
char pad[BUFFERDESC_PAD_TO_SIZE]
bool StrategyRejectBuffer(BufferAccessStrategy strategy, BufferDesc *buf)
int StrategySyncStart(uint32 *complete_passes, uint32 *num_buf_alloc)
static void init(bool is_no_vacuum)
struct CkptSortItem CkptSortItem
struct WritebackContext WritebackContext
void StrategyFreeBuffer(BufferDesc *buf)
BufferDesc * LocalBufferDescriptors
void DropRelFileNodeAllLocalBuffers(RelFileNode rnode)
void StrategyNotifyBgWriter(int bgwprocno)