15#ifndef BUFMGR_INTERNALS_H
16#define BUFMGR_INTERNALS_H
49#define BUF_REFCOUNT_BITS 18
50#define BUF_USAGECOUNT_BITS 4
51#define BUF_FLAG_BITS 12
52#define BUF_LOCK_BITS (18+2)
55 "parts of buffer state space need to be <= 64");
58#define BUF_REFCOUNT_ONE 1
59#define BUF_REFCOUNT_MASK \
60 ((UINT64CONST(1) << BUF_REFCOUNT_BITS) - 1)
63#define BUF_USAGECOUNT_SHIFT \
65#define BUF_USAGECOUNT_MASK \
66 (((UINT64CONST(1) << BUF_USAGECOUNT_BITS) - 1) << (BUF_USAGECOUNT_SHIFT))
67#define BUF_USAGECOUNT_ONE \
68 (UINT64CONST(1) << BUF_REFCOUNT_BITS)
71#define BUF_FLAG_SHIFT \
72 (BUF_REFCOUNT_BITS + BUF_USAGECOUNT_BITS)
73#define BUF_FLAG_MASK \
74 (((UINT64CONST(1) << BUF_FLAG_BITS) - 1) << BUF_FLAG_SHIFT)
77#define BM_LOCK_SHIFT \
78 (BUF_FLAG_SHIFT + BUF_FLAG_BITS)
79#define BM_LOCK_VAL_SHARED \
80 (UINT64CONST(1) << (BM_LOCK_SHIFT))
81#define BM_LOCK_VAL_SHARE_EXCLUSIVE \
82 (UINT64CONST(1) << (BM_LOCK_SHIFT + MAX_BACKENDS_BITS))
83#define BM_LOCK_VAL_EXCLUSIVE \
84 (UINT64CONST(1) << (BM_LOCK_SHIFT + MAX_BACKENDS_BITS + 1))
86 ((((uint64) MAX_BACKENDS) << BM_LOCK_SHIFT) | BM_LOCK_VAL_SHARE_EXCLUSIVE | BM_LOCK_VAL_EXCLUSIVE)
90#define BUF_STATE_GET_REFCOUNT(state) \
91 ((uint32)((state) & BUF_REFCOUNT_MASK))
92#define BUF_STATE_GET_USAGECOUNT(state) \
93 ((uint32)(((state) & BUF_USAGECOUNT_MASK) >> BUF_USAGECOUNT_SHIFT))
102#define BUF_DEFINE_FLAG(flagno) \
103 (UINT64CONST(1) << (BUF_FLAG_SHIFT + (flagno)))
106#define BM_LOCKED BUF_DEFINE_FLAG( 0)
108#define BM_DIRTY BUF_DEFINE_FLAG( 1)
110#define BM_VALID BUF_DEFINE_FLAG( 2)
112#define BM_TAG_VALID BUF_DEFINE_FLAG( 3)
114#define BM_IO_IN_PROGRESS BUF_DEFINE_FLAG( 4)
116#define BM_IO_ERROR BUF_DEFINE_FLAG( 5)
118#define BM_JUST_DIRTIED BUF_DEFINE_FLAG( 6)
120#define BM_PIN_COUNT_WAITER BUF_DEFINE_FLAG( 7)
122#define BM_CHECKPOINT_NEEDED BUF_DEFINE_FLAG( 8)
124#define BM_PERMANENT BUF_DEFINE_FLAG( 9)
126#define BM_LOCK_HAS_WAITERS BUF_DEFINE_FLAG(10)
128#define BM_LOCK_WAKE_IN_PROGRESS BUF_DEFINE_FLAG(11)
132 "MAX_BACKENDS_BITS needs to be <= BUF_REFCOUNT_BITS");
134 "MAX_BACKENDS_BITS needs to be <= BUF_LOCK_BITS - 2");
145#define BM_MAX_USAGE_COUNT 5
148 "BM_MAX_USAGE_COUNT doesn't fit in BUF_USAGECOUNT_BITS bits");
225 return (
tag1->spcOid ==
tag2->spcOid) &&
227 (
tag1->relNumber ==
tag2->relNumber) &&
228 (
tag1->blockNum ==
tag2->blockNum) &&
382#define BUFFERDESC_PAD_TO_SIZE (SIZEOF_VOID_P == 8 ? 64 : 1)
static bool pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval)
static uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)
static uint64 pg_atomic_fetch_sub_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
#define InvalidBlockNumber
#define BM_MAX_USAGE_COUNT
void FlushLocalBuffer(BufferDesc *bufHdr, SMgrRelation reln)
PGDLLIMPORT const ResourceOwnerDesc buffer_resowner_desc
static void InitBufferTag(BufferTag *tag, const RelFileLocator *rlocator, ForkNumber forkNum, BlockNumber blockNum)
static uint32 BufTableHashPartition(uint32 hashcode)
static LWLock * BufMappingPartitionLockByIndex(uint32 index)
void BufTableDelete(BufferTag *tagPtr, uint32 hashcode)
void UnpinLocalBuffer(Buffer buffer)
int StrategySyncStart(uint32 *complete_passes, uint32 *num_buf_alloc)
static ForkNumber BufTagGetForkNum(const BufferTag *tag)
static ConditionVariable * BufferDescriptorGetIOCV(const BufferDesc *bdesc)
bool StartLocalBufferIO(BufferDesc *bufHdr, bool forInput, bool nowait)
static uint64 UnlockBufHdrExt(BufferDesc *desc, uint64 old_buf_state, uint64 set_bits, uint64 unset_bits, int refcount_change)
void AtEOXact_LocalBuffers(bool isCommit)
int BufTableLookup(BufferTag *tagPtr, uint32 hashcode)
BufferDesc * StrategyGetBuffer(BufferAccessStrategy strategy, uint64 *buf_state, bool *from_ring)
static bool BufferTagsEqual(const BufferTag *tag1, const BufferTag *tag2)
static RelFileNumber BufTagGetRelNumber(const BufferTag *tag)
static void UnlockBufHdr(BufferDesc *desc)
static bool BufTagMatchesRelFileLocator(const BufferTag *tag, const RelFileLocator *rlocator)
#define BUF_REFCOUNT_BITS
bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount)
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)
uint64 LockBufHdr(BufferDesc *desc)
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)
void InvalidateLocalBuffer(BufferDesc *bufHdr, bool check_unreferenced)
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)
void TerminateLocalBufferIO(BufferDesc *bufHdr, bool clear_dirty, uint64 set_flag_bits, bool release_aio)
PGDLLIMPORT BufferDescPadded * BufferDescriptors
PrefetchBufferResult PrefetchLocalBuffer(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum)
PGDLLIMPORT ConditionVariableMinimallyPadded * BufferIOCVArray
StaticAssertDecl(BM_MAX_USAGE_COUNT<(UINT64CONST(1)<< BUF_USAGECOUNT_BITS), "BM_MAX_USAGE_COUNT doesn't fit in BUF_USAGECOUNT_BITS bits")
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)
void DropRelationLocalBuffers(RelFileLocator rlocator, ForkNumber *forkNum, int nforks, BlockNumber *firstDelBlock)
static LWLock * BufMappingPartitionLock(uint32 hashcode)
void TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint64 set_flag_bits, bool forget_owner, bool release_aio)
bool StartBufferIO(BufferDesc *buf, bool forInput, bool nowait)
static RelFileLocator BufTagGetRelFileLocator(const BufferTag *tag)
Size StrategyShmemSize(void)
uint64 WaitBufHdrUnlocked(BufferDesc *buf)
PGDLLIMPORT BufferDesc * LocalBufferDescriptors
static BufferDesc * GetLocalBufferDescriptor(uint32 id)
static BufferDesc * GetBufferDescriptor(uint32 id)
void TrackNewBufferPin(Buffer 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)
#define Assert(condition)
LWLockPadded * MainLWLockArray
#define BUFFER_MAPPING_LWLOCK_OFFSET
#define NUM_BUFFER_PARTITIONS
#define WRITEBACK_MAX_PENDING_FLUSHES
static char buf[DEFAULT_XLOG_SEG_SIZE]
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
proclist_head lock_waiters
PendingWriteback pending_writebacks[WRITEBACK_MAX_PENDING_FLUSHES]
char pad[BUFFERDESC_PAD_TO_SIZE]