15#ifndef BUFMGR_INTERNALS_H
16#define BUFMGR_INTERNALS_H
43#define BUF_REFCOUNT_BITS 18
44#define BUF_USAGECOUNT_BITS 4
45#define BUF_FLAG_BITS 10
48 "parts of buffer state space need to equal 32");
50#define BUF_REFCOUNT_ONE 1
51#define BUF_REFCOUNT_MASK ((1U << BUF_REFCOUNT_BITS) - 1)
52#define BUF_USAGECOUNT_MASK (((1U << BUF_USAGECOUNT_BITS) - 1) << (BUF_REFCOUNT_BITS))
53#define BUF_USAGECOUNT_ONE (1U << BUF_REFCOUNT_BITS)
54#define BUF_USAGECOUNT_SHIFT BUF_REFCOUNT_BITS
55#define BUF_FLAG_MASK (((1U << BUF_FLAG_BITS) - 1) << (BUF_REFCOUNT_BITS + BUF_USAGECOUNT_BITS))
58#define BUF_STATE_GET_REFCOUNT(state) ((state) & BUF_REFCOUNT_MASK)
59#define BUF_STATE_GET_USAGECOUNT(state) (((state) & BUF_USAGECOUNT_MASK) >> BUF_USAGECOUNT_SHIFT)
67#define BM_LOCKED (1U << 22)
68#define BM_DIRTY (1U << 23)
69#define BM_VALID (1U << 24)
70#define BM_TAG_VALID (1U << 25)
71#define BM_IO_IN_PROGRESS (1U << 26)
72#define BM_IO_ERROR (1U << 27)
73#define BM_JUST_DIRTIED (1U << 28)
74#define BM_PIN_COUNT_WAITER (1U << 29)
75#define BM_CHECKPOINT_NEEDED (1U << 30)
76#define BM_PERMANENT (1U << 31)
86#define BM_MAX_USAGE_COUNT 5
89 "BM_MAX_USAGE_COUNT doesn't fit in BUF_USAGECOUNT_BITS bits");
91 "MAX_BACKENDS_BITS needs to be <= BUF_REFCOUNT_BITS");
290#define BUFFERDESC_PAD_TO_SIZE (SIZEOF_VOID_P == 8 ? 64 : 1)
364#define FREENEXT_END_OF_LIST (-1)
365#define FREENEXT_NOT_IN_LIST (-2)
437 uint32 *buf_state,
bool *from_ring);
#define pg_write_barrier()
static void pg_atomic_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)
#define InvalidBlockNumber
#define BM_MAX_USAGE_COUNT
void FlushLocalBuffer(BufferDesc *bufHdr, SMgrRelation reln)
static void InitBufferTag(BufferTag *tag, const RelFileLocator *rlocator, ForkNumber forkNum, BlockNumber blockNum)
struct CkptSortItem CkptSortItem
static uint32 BufTableHashPartition(uint32 hashcode)
static LWLock * BufMappingPartitionLockByIndex(uint32 index)
void BufTableDelete(BufferTag *tagPtr, uint32 hashcode)
union BufferDescPadded BufferDescPadded
void UnpinLocalBuffer(Buffer buffer)
int StrategySyncStart(uint32 *complete_passes, uint32 *num_buf_alloc)
StaticAssertDecl(BUF_REFCOUNT_BITS+BUF_USAGECOUNT_BITS+BUF_FLAG_BITS==32, "parts of buffer state space need to equal 32")
static ForkNumber BufTagGetForkNum(const BufferTag *tag)
static ConditionVariable * BufferDescriptorGetIOCV(const BufferDesc *bdesc)
struct BufferDesc BufferDesc
void AtEOXact_LocalBuffers(bool isCommit)
static void UnlockBufHdr(BufferDesc *desc, uint32 buf_state)
bool have_free_buffer(void)
void DropRelationLocalBuffers(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber firstDelBlock)
int BufTableLookup(BufferTag *tagPtr, uint32 hashcode)
static bool BufferTagsEqual(const BufferTag *tag1, const BufferTag *tag2)
static RelFileNumber BufTagGetRelNumber(const BufferTag *tag)
static LWLock * BufferDescriptorGetContentLock(const BufferDesc *bdesc)
static bool BufTagMatchesRelFileLocator(const BufferTag *tag, const RelFileLocator *rlocator)
#define BUF_REFCOUNT_BITS
struct WritebackContext WritebackContext
bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount)
struct PendingWriteback PendingWriteback
static void BufTagSetRelForkDetails(BufferTag *tag, RelFileNumber relnumber, ForkNumber forknum)
void InitBufTable(int size)
PGDLLIMPORT const ResourceOwnerDesc buffer_io_resowner_desc
void StrategyInitialize(bool init)
#define BUF_USAGECOUNT_BITS
static void ResourceOwnerRememberBufferIO(ResourceOwner owner, Buffer buffer)
void TerminateLocalBufferIO(BufferDesc *bufHdr, bool clear_dirty, uint32 set_flag_bits)
void MarkLocalBufferDirty(Buffer buffer)
#define BUFFERDESC_PAD_TO_SIZE
PGDLLIMPORT WritebackContext BackendWritebackContext
static void ResourceOwnerForgetBufferIO(ResourceOwner owner, Buffer buffer)
Size BufTableShmemSize(int size)
uint32 BufTableHashCode(BufferTag *tagPtr)
void DropRelationAllLocalBuffers(RelFileLocator rlocator)
void ScheduleBufferTagForWriteback(WritebackContext *wb_context, IOContext io_context, BufferTag *tag)
int BufTableInsert(BufferTag *tagPtr, uint32 hashcode, int buf_id)
static void ClearBufferTag(BufferTag *tag)
static void ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer)
void WritebackContextInit(WritebackContext *context, int *max_pending)
void StrategyNotifyBgWriter(int bgwprocno)
static void ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer)
PGDLLIMPORT BufferDescPadded * BufferDescriptors
bool StartLocalBufferIO(BufferDesc *bufHdr, bool forInput)
PrefetchBufferResult PrefetchLocalBuffer(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum)
PGDLLIMPORT ConditionVariableMinimallyPadded * BufferIOCVArray
BlockNumber ExtendBufferedRelLocal(BufferManagerRelation bmr, ForkNumber fork, uint32 flags, uint32 extend_by, BlockNumber extend_upto, Buffer *buffers, uint32 *extended_by)
void IssuePendingWritebacks(WritebackContext *wb_context, IOContext io_context)
PGDLLIMPORT CkptSortItem * CkptBufferIds
IOContext IOContextForStrategy(BufferAccessStrategy strategy)
void UnpinLocalBufferNoOwner(Buffer buffer)
static LWLock * BufMappingPartitionLock(uint32 hashcode)
BufferDesc * StrategyGetBuffer(BufferAccessStrategy strategy, uint32 *buf_state, bool *from_ring)
static RelFileLocator BufTagGetRelFileLocator(const BufferTag *tag)
Size StrategyShmemSize(void)
PGDLLIMPORT BufferDesc * LocalBufferDescriptors
PGDLLIMPORT const ResourceOwnerDesc buffer_pin_resowner_desc
uint32 LockBufHdr(BufferDesc *desc)
static BufferDesc * GetLocalBufferDescriptor(uint32 id)
static BufferDesc * GetBufferDescriptor(uint32 id)
void StrategyFreeBuffer(BufferDesc *buf)
bool StrategyRejectBuffer(BufferAccessStrategy strategy, BufferDesc *buf, bool from_ring)
static Buffer BufferDescriptorGetBuffer(const BufferDesc *bdesc)
BufferDesc * LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, bool *foundPtr)
LWLockPadded * MainLWLockArray
#define BUFFER_MAPPING_LWLOCK_OFFSET
#define NUM_BUFFER_PARTITIONS
#define WRITEBACK_MAX_PENDING_FLUSHES
static Datum Int32GetDatum(int32 X)
#define MAX_BACKENDS_BITS
#define InvalidRelFileNumber
void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)
int wait_backend_pgprocno
PendingWriteback pending_writebacks[WRITEBACK_MAX_PENDING_FLUSHES]
char pad[BUFFERDESC_PAD_TO_SIZE]