109#define MAPSIZE (BLCKSZ - MAXALIGN(SizeOfPageHeaderData))
112#define HEAPBLOCKS_PER_BYTE (BITS_PER_BYTE / BITS_PER_HEAPBLOCK)
115#define HEAPBLOCKS_PER_PAGE (MAPSIZE * HEAPBLOCKS_PER_BYTE)
118#define HEAPBLK_TO_MAPBLOCK(x) ((x) / HEAPBLOCKS_PER_PAGE)
119#define HEAPBLK_TO_MAPBYTE(x) (((x) % HEAPBLOCKS_PER_PAGE) / HEAPBLOCKS_PER_BYTE)
120#define HEAPBLK_TO_OFFSET(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK)
123#define VISIBLE_MASK8 (0x55)
124#define FROZEN_MASK8 (0xaa)
144 uint8 mask = flags << mapOffset;
146 bool cleared =
false;
152#ifdef TRACE_VISIBILITYMAP
157 elog(
ERROR,
"wrong buffer passed to visibilitymap_clear");
162 if (map[mapByte] & mask)
164 map[mapByte] &= ~mask;
258#ifdef TRACE_VISIBILITYMAP
272 elog(
ERROR,
"wrong heap buffer passed to visibilitymap_set");
279 elog(
ERROR,
"wrong VM buffer passed to visibilitymap_set");
290 map[mapByte] |= (flags << mapOffset);
358#ifdef TRACE_VISIBILITYMAP
376 elog(
ERROR,
"wrong VM buffer passed to visibilitymap_set");
386 map[mapByte] |= (flags << mapOffset);
421#ifdef TRACE_VISIBILITYMAP
470 for (mapBlock = 0;; mapBlock++)
498 *all_visible = nvisible;
500 *all_frozen = nfrozen;
524#ifdef TRACE_VISIBILITYMAP
542 if (truncByte != 0 || truncOffset != 0)
548 newnblocks = truncBlock + 1;
550 mapBuffer =
vm_readbuf(rel, truncBlock,
false);
578 map[truncByte] &= (1 << truncOffset) - 1;
597 newnblocks = truncBlock;
#define InvalidBlockNumber
BlockNumber BufferGetBlockNumber(Buffer buffer)
bool BufferIsLockedByMeInMode(Buffer buffer, int mode)
Buffer ExtendBufferedRelTo(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, BlockNumber extend_to, ReadBufferMode mode)
void ReleaseBuffer(Buffer buffer)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
void LockBuffer(Buffer buffer, int mode)
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define BUFFER_LOCK_UNLOCK
static Page BufferGetPage(Buffer buffer)
@ EB_CREATE_FORK_IF_NEEDED
#define BUFFER_LOCK_EXCLUSIVE
static bool BufferIsValid(Buffer bufnum)
void PageInit(Page page, Size pageSize, Size specialSize)
static bool PageIsAllVisible(const PageData *page)
static bool PageIsNew(const PageData *page)
static char * PageGetContents(Page page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define MemSet(start, val, len)
volatile uint32 CritSectionCount
Assert(PointerIsAligned(start, uint64))
XLogRecPtr log_heap_visible(Relation rel, Buffer heap_buffer, Buffer vm_buffer, TransactionId snapshotConflictHorizon, uint8 vmflags)
void CacheInvalidateSmgr(RelFileLocatorBackend rlocator)
#define START_CRIT_SECTION()
#define END_CRIT_SECTION()
static uint64 pg_popcount_masked(const char *buf, int bytes, bits8 mask)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetRelationName(relation)
#define RelationNeedsWAL(relation)
#define relpathbackend(rlocator, backend, forknum)
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
BlockNumber smgr_cached_nblocks[MAX_FORKNUM+1]
bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf)
bool visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf, uint8 flags)
#define HEAPBLK_TO_OFFSET(x)
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *vmbuf)
uint8 visibilitymap_get_status(Relation rel, BlockNumber heapBlk, Buffer *vmbuf)
static Buffer vm_extend(Relation rel, BlockNumber vm_nblocks)
uint8 visibilitymap_set_vmbits(BlockNumber heapBlk, Buffer vmBuf, uint8 flags, const RelFileLocator rlocator)
BlockNumber visibilitymap_prepare_truncate(Relation rel, BlockNumber nheapblocks)
void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen)
static Buffer vm_readbuf(Relation rel, BlockNumber blkno, bool extend)
uint8 visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid, uint8 flags)
#define HEAPBLK_TO_MAPBLOCK(x)
#define HEAPBLK_TO_MAPBYTE(x)
#define VISIBILITYMAP_VALID_BITS
#define VISIBILITYMAP_ALL_FROZEN
#define VISIBILITYMAP_ALL_VISIBLE
#define XLogHintBitIsNeeded()
#define XLogRecPtrIsValid(r)
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)