107 #define MAPSIZE (BLCKSZ - MAXALIGN(SizeOfPageHeaderData)) 110 #define HEAPBLOCKS_PER_BYTE (BITS_PER_BYTE / BITS_PER_HEAPBLOCK) 113 #define HEAPBLOCKS_PER_PAGE (MAPSIZE * HEAPBLOCKS_PER_BYTE) 116 #define HEAPBLK_TO_MAPBLOCK(x) ((x) / HEAPBLOCKS_PER_PAGE) 117 #define HEAPBLK_TO_MAPBYTE(x) (((x) % HEAPBLOCKS_PER_PAGE) / HEAPBLOCKS_PER_BYTE) 118 #define HEAPBLK_TO_OFFSET(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK) 121 #define VISIBLE_MASK64 UINT64CONST(0x5555555555555555) 123 #define FROZEN_MASK64 UINT64CONST(0xaaaaaaaaaaaaaaaa) 144 uint8 mask = flags << mapOffset;
146 bool cleared =
false;
150 #ifdef TRACE_VISIBILITYMAP 155 elog(
ERROR,
"wrong buffer passed to visibilitymap_clear");
160 if (map[mapByte] & mask)
162 map[mapByte] &= ~mask;
253 #ifdef TRACE_VISIBILITYMAP 263 elog(
ERROR,
"wrong heap buffer passed to visibilitymap_set");
267 elog(
ERROR,
"wrong VM buffer passed to visibilitymap_set");
273 if (flags != (map[mapByte] >> mapOffset & VISIBILITYMAP_VALID_BITS))
277 map[mapByte] |= (flags << mapOffset);
338 #ifdef TRACE_VISIBILITYMAP 387 for (mapBlock = 0;; mapBlock++)
410 "unsupported MAPSIZE");
411 if (all_frozen == NULL)
413 for (i = 0; i <
MAPSIZE /
sizeof(uint64); i++)
418 for (i = 0; i <
MAPSIZE /
sizeof(uint64); i++)
428 *all_visible = nvisible;
430 *all_frozen = nfrozen;
454 #ifdef TRACE_VISIBILITYMAP 474 if (truncByte != 0 || truncOffset != 0)
480 newnblocks = truncBlock + 1;
482 mapBuffer =
vm_readbuf(rel, truncBlock,
false);
510 map[truncByte] &= (1 << truncOffset) - 1;
529 newnblocks = truncBlock;
653 while (vm_nblocks_now < vm_nblocks)
void CacheInvalidateSmgr(RelFileNodeBackend rnode)
#define BUFFER_LOCK_UNLOCK
XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
#define PageIsAllVisible(page)
void visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf)
static void vm_extend(Relation rel, BlockNumber vm_nblocks)
void visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid, uint8 flags)
void MarkBufferDirty(Buffer buffer)
struct SMgrRelationData * rd_smgr
Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy)
#define END_CRIT_SECTION()
#define HEAPBLK_TO_MAPBYTE(x)
#define START_CRIT_SECTION()
#define MemSet(start, val, len)
void ReleaseBuffer(Buffer buffer)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen)
#define BUFFER_LOCK_EXCLUSIVE
BlockNumber smgr_cached_nblocks[MAX_FORKNUM+1]
#define VISIBILITYMAP_VALID_BITS
#define RelationOpenSmgr(relation)
#define StaticAssertStmt(condition, errmessage)
bool visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer buf, uint8 flags)
void UnlockReleaseBuffer(Buffer buffer)
XLogRecPtr log_heap_visible(RelFileNode rnode, Buffer heap_buffer, Buffer vm_buffer, TransactionId cutoff_xid, uint8 vmflags)
RelFileNodeBackend smgr_rnode
int(* pg_popcount64)(uint64 word)
#define RelationGetRelationName(relation)
#define BufferGetPage(buffer)
#define XLogRecPtrIsInvalid(r)
void LockRelationForExtension(Relation relation, LOCKMODE lockmode)
void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode)
#define PageGetContents(page)
void LockBuffer(Buffer buffer, int mode)
BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum)
#define Assert(condition)
#define HEAPBLK_TO_OFFSET(x)
#define InvalidBlockNumber
void PageSetChecksumInplace(Page page, BlockNumber blkno)
#define BufferIsValid(bufnum)
#define RelationNeedsWAL(relation)
void smgrextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, char *buffer, bool skipFsync)
BlockNumber BufferGetBlockNumber(Buffer buffer)
uint8 visibilitymap_get_status(Relation rel, BlockNumber heapBlk, Buffer *buf)
BlockNumber visibilitymap_prepare_truncate(Relation rel, BlockNumber nheapblocks)
bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer buf)
static Buffer vm_readbuf(Relation rel, BlockNumber blkno, bool extend)
#define PageSetLSN(page, lsn)
#define XLogHintBitIsNeeded()
#define HEAPBLK_TO_MAPBLOCK(x)
void PageInit(Page page, Size pageSize, Size specialSize)