From 27d2693187d1bcf2563ee7142ba37d4788c8d52b Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 13 Jul 2022 13:37:10 -0400 Subject: [PATCH] Avoid unsatisfied-external-reference errors in static inlines. Commit 9c727360b neglected the lesson we've learned before: protect references to backend global variables with #ifndef FRONTEND. Since there's already a place for static inlines in this file, move the just-converted functions to that stanza. Undo the entirely gratuitous de-macroization of RelationGetNumberOfBlocks (that one may be okay, since it has no global variable references, but it's also pointless). Per buildfarm. --- src/include/storage/bufmgr.h | 192 +++++++++++++++++------------------ 1 file changed, 93 insertions(+), 99 deletions(-) diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index f7fc60815a6..bf8cce7ccf6 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -97,9 +97,101 @@ extern PGDLLIMPORT int32 *LocalRefCount; #define BUFFER_LOCK_SHARE 1 #define BUFFER_LOCK_EXCLUSIVE 2 + /* - * These routines are beaten on quite heavily, hence inline. + * prototypes for functions in bufmgr.c */ +extern PrefetchBufferResult PrefetchSharedBuffer(struct SMgrRelationData *smgr_reln, + ForkNumber forkNum, + BlockNumber blockNum); +extern PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum, + BlockNumber blockNum); +extern bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, + BlockNumber blockNum, Buffer recent_buffer); +extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum); +extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, + BlockNumber blockNum, ReadBufferMode mode, + BufferAccessStrategy strategy); +extern Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, + ForkNumber forkNum, BlockNumber blockNum, + ReadBufferMode mode, BufferAccessStrategy strategy, + bool permanent); +extern void ReleaseBuffer(Buffer buffer); +extern void UnlockReleaseBuffer(Buffer buffer); +extern void MarkBufferDirty(Buffer buffer); +extern void IncrBufferRefCount(Buffer buffer); +extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, + BlockNumber blockNum); + +extern void InitBufferPool(void); +extern void InitBufferPoolAccess(void); +extern void AtEOXact_Buffers(bool isCommit); +extern void PrintBufferLeakWarning(Buffer buffer); +extern void CheckPointBuffers(int flags); +extern BlockNumber BufferGetBlockNumber(Buffer buffer); +extern BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, + ForkNumber forkNum); +extern void FlushOneBuffer(Buffer buffer); +extern void FlushRelationBuffers(Relation rel); +extern void FlushRelationsAllBuffers(struct SMgrRelationData **smgrs, int nrels); +extern void CreateAndCopyRelationData(RelFileLocator src_rlocator, + RelFileLocator dst_rlocator, + bool permanent); +extern void FlushDatabaseBuffers(Oid dbid); +extern void DropRelationBuffers(struct SMgrRelationData *smgr_reln, + ForkNumber *forkNum, + int nforks, BlockNumber *firstDelBlock); +extern void DropRelationsAllBuffers(struct SMgrRelationData **smgr_reln, + int nlocators); +extern void DropDatabaseBuffers(Oid dbid); + +#define RelationGetNumberOfBlocks(reln) \ + RelationGetNumberOfBlocksInFork(reln, MAIN_FORKNUM) + +extern bool BufferIsPermanent(Buffer buffer); +extern XLogRecPtr BufferGetLSNAtomic(Buffer buffer); + +#ifdef NOT_USED +extern void PrintPinnedBufs(void); +#endif +extern Size BufferShmemSize(void); +extern void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, + ForkNumber *forknum, BlockNumber *blknum); + +extern void MarkBufferDirtyHint(Buffer buffer, bool buffer_std); + +extern void UnlockBuffers(void); +extern void LockBuffer(Buffer buffer, int mode); +extern bool ConditionalLockBuffer(Buffer buffer); +extern void LockBufferForCleanup(Buffer buffer); +extern bool ConditionalLockBufferForCleanup(Buffer buffer); +extern bool IsBufferCleanupOK(Buffer buffer); +extern bool HoldingBufferPinThatDelaysRecovery(void); + +extern void AbortBufferIO(void); + +extern void BufmgrCommit(void); +extern bool BgBufferSync(struct WritebackContext *wb_context); + +extern void AtProcExit_LocalBuffers(void); + +extern void TestForOldSnapshot_impl(Snapshot snapshot, Relation relation); + +/* in freelist.c */ +extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype); +extern void FreeAccessStrategy(BufferAccessStrategy strategy); + + +/* inline functions */ + +/* + * Although this header file is nominally backend-only, certain frontend + * programs like pg_waldump include it. For compilers that emit static + * inline functions even when they're unused, that leads to unsatisfied + * external references; hence hide these with #ifndef FRONTEND. + */ + +#ifndef FRONTEND /* * BufferIsValid @@ -178,104 +270,6 @@ BufferGetPage(Buffer buffer) return (Page) BufferGetBlock(buffer); } -/* - * prototypes for functions in bufmgr.c - */ -extern PrefetchBufferResult PrefetchSharedBuffer(struct SMgrRelationData *smgr_reln, - ForkNumber forkNum, - BlockNumber blockNum); -extern PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum, - BlockNumber blockNum); -extern bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, - BlockNumber blockNum, Buffer recent_buffer); -extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum); -extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, - BlockNumber blockNum, ReadBufferMode mode, - BufferAccessStrategy strategy); -extern Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, - ForkNumber forkNum, BlockNumber blockNum, - ReadBufferMode mode, BufferAccessStrategy strategy, - bool permanent); -extern void ReleaseBuffer(Buffer buffer); -extern void UnlockReleaseBuffer(Buffer buffer); -extern void MarkBufferDirty(Buffer buffer); -extern void IncrBufferRefCount(Buffer buffer); -extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, - BlockNumber blockNum); - -extern void InitBufferPool(void); -extern void InitBufferPoolAccess(void); -extern void AtEOXact_Buffers(bool isCommit); -extern void PrintBufferLeakWarning(Buffer buffer); -extern void CheckPointBuffers(int flags); -extern BlockNumber BufferGetBlockNumber(Buffer buffer); -extern BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, - ForkNumber forkNum); -static inline BlockNumber -RelationGetNumberOfBlocks(Relation reln) -{ - return RelationGetNumberOfBlocksInFork(reln, MAIN_FORKNUM); -} - -extern void FlushOneBuffer(Buffer buffer); -extern void FlushRelationBuffers(Relation rel); -extern void FlushRelationsAllBuffers(struct SMgrRelationData **smgrs, int nrels); -extern void CreateAndCopyRelationData(RelFileLocator src_rlocator, - RelFileLocator dst_rlocator, - bool permanent); -extern void FlushDatabaseBuffers(Oid dbid); -extern void DropRelationBuffers(struct SMgrRelationData *smgr_reln, - ForkNumber *forkNum, - int nforks, BlockNumber *firstDelBlock); -extern void DropRelationsAllBuffers(struct SMgrRelationData **smgr_reln, - int nlocators); -extern void DropDatabaseBuffers(Oid dbid); - -extern bool BufferIsPermanent(Buffer buffer); -extern XLogRecPtr BufferGetLSNAtomic(Buffer buffer); - -#ifdef NOT_USED -extern void PrintPinnedBufs(void); -#endif -extern Size BufferShmemSize(void); -extern void BufferGetTag(Buffer buffer, RelFileLocator *rlocator, - ForkNumber *forknum, BlockNumber *blknum); - -extern void MarkBufferDirtyHint(Buffer buffer, bool buffer_std); - -extern void UnlockBuffers(void); -extern void LockBuffer(Buffer buffer, int mode); -extern bool ConditionalLockBuffer(Buffer buffer); -extern void LockBufferForCleanup(Buffer buffer); -extern bool ConditionalLockBufferForCleanup(Buffer buffer); -extern bool IsBufferCleanupOK(Buffer buffer); -extern bool HoldingBufferPinThatDelaysRecovery(void); - -extern void AbortBufferIO(void); - -extern void BufmgrCommit(void); -extern bool BgBufferSync(struct WritebackContext *wb_context); - -extern void AtProcExit_LocalBuffers(void); - -extern void TestForOldSnapshot_impl(Snapshot snapshot, Relation relation); - -/* in freelist.c */ -extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype); -extern void FreeAccessStrategy(BufferAccessStrategy strategy); - - -/* inline functions */ - -/* - * Although this header file is nominally backend-only, certain frontend - * programs like pg_waldump include it. For compilers that emit static - * inline functions even when they're unused, that leads to unsatisfied - * external references; hence hide these with #ifndef FRONTEND. - */ - -#ifndef FRONTEND - /* * Check whether the given snapshot is too old to have safely read the given * page from the given table. If so, throw a "snapshot too old" error.