1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-25 12:03:53 +03:00

Convert macros to static inline functions (buf_internals.h)

Dilip Kumar, reviewed by Vignesh C, Ashutosh Sharma, and me.

Discussion: http://postgr.es/m/CAFiTN-tYbM7D+2UGiNc2kAFMSQTa5FTeYvmg-Vj2HvPdVw2Gvg@mail.gmail.com
This commit is contained in:
Robert Haas
2022-07-27 13:54:37 -04:00
parent 03361a368e
commit 3ac88fddd9
4 changed files with 110 additions and 74 deletions

View File

@@ -85,7 +85,7 @@
* relation is visible yet (its xact may have started before the xact that
* created the rel). The storage manager must be able to cope anyway.
*
* Note: if there's any pad bytes in the struct, INIT_BUFFERTAG will have
* Note: if there's any pad bytes in the struct, InitBufferTag will have
* to be fixed to zero them, since this struct is used as a hash key.
*/
typedef struct buftag
@@ -95,28 +95,32 @@ typedef struct buftag
BlockNumber blockNum; /* blknum relative to begin of reln */
} BufferTag;
#define CLEAR_BUFFERTAG(a) \
( \
(a).rlocator.spcOid = InvalidOid, \
(a).rlocator.dbOid = InvalidOid, \
(a).rlocator.relNumber = InvalidRelFileNumber, \
(a).forkNum = InvalidForkNumber, \
(a).blockNum = InvalidBlockNumber \
)
static inline void
ClearBufferTag(BufferTag *tag)
{
tag->rlocator.spcOid = InvalidOid;
tag->rlocator.dbOid = InvalidOid;
tag->rlocator.relNumber = InvalidRelFileNumber;
tag->forkNum = InvalidForkNumber;
tag->blockNum = InvalidBlockNumber;
}
#define INIT_BUFFERTAG(a,xx_rlocator,xx_forkNum,xx_blockNum) \
( \
(a).rlocator = (xx_rlocator), \
(a).forkNum = (xx_forkNum), \
(a).blockNum = (xx_blockNum) \
)
static inline void
InitBufferTag(BufferTag *tag, const RelFileLocator *rlocator,
ForkNumber forkNum, BlockNumber blockNum)
{
tag->rlocator = *rlocator;
tag->forkNum = forkNum;
tag->blockNum = blockNum;
}
#define BUFFERTAGS_EQUAL(a,b) \
( \
RelFileLocatorEquals((a).rlocator, (b).rlocator) && \
(a).blockNum == (b).blockNum && \
(a).forkNum == (b).forkNum \
)
static inline bool
BufferTagsEqual(const BufferTag *tag1, const BufferTag *tag2)
{
return RelFileLocatorEquals(tag1->rlocator, tag2->rlocator) &&
(tag1->blockNum == tag2->blockNum) &&
(tag1->forkNum == tag2->forkNum);
}
/*
* The shared buffer mapping table is partitioned to reduce contention.
@@ -124,13 +128,24 @@ typedef struct buftag
* hash code with BufTableHashCode(), then apply BufMappingPartitionLock().
* NB: NUM_BUFFER_PARTITIONS must be a power of 2!
*/
#define BufTableHashPartition(hashcode) \
((hashcode) % NUM_BUFFER_PARTITIONS)
#define BufMappingPartitionLock(hashcode) \
(&MainLWLockArray[BUFFER_MAPPING_LWLOCK_OFFSET + \
BufTableHashPartition(hashcode)].lock)
#define BufMappingPartitionLockByIndex(i) \
(&MainLWLockArray[BUFFER_MAPPING_LWLOCK_OFFSET + (i)].lock)
static inline uint32
BufTableHashPartition(uint32 hashcode)
{
return hashcode % NUM_BUFFER_PARTITIONS;
}
static inline LWLock *
BufMappingPartitionLock(uint32 hashcode)
{
return &MainLWLockArray[BUFFER_MAPPING_LWLOCK_OFFSET +
BufTableHashPartition(hashcode)].lock;
}
static inline LWLock *
BufMappingPartitionLockByIndex(uint32 index)
{
return &MainLWLockArray[BUFFER_MAPPING_LWLOCK_OFFSET + index].lock;
}
/*
* BufferDesc -- shared descriptor/state data for a single shared buffer.
@@ -220,37 +235,6 @@ typedef union BufferDescPadded
char pad[BUFFERDESC_PAD_TO_SIZE];
} BufferDescPadded;
#define GetBufferDescriptor(id) (&BufferDescriptors[(id)].bufferdesc)
#define GetLocalBufferDescriptor(id) (&LocalBufferDescriptors[(id)])
#define BufferDescriptorGetBuffer(bdesc) ((bdesc)->buf_id + 1)
#define BufferDescriptorGetIOCV(bdesc) \
(&(BufferIOCVArray[(bdesc)->buf_id]).cv)
#define BufferDescriptorGetContentLock(bdesc) \
((LWLock*) (&(bdesc)->content_lock))
extern PGDLLIMPORT ConditionVariableMinimallyPadded *BufferIOCVArray;
/*
* The freeNext field is either the index of the next freelist entry,
* or one of these special values:
*/
#define FREENEXT_END_OF_LIST (-1)
#define FREENEXT_NOT_IN_LIST (-2)
/*
* Functions for acquiring/releasing a shared buffer header's spinlock. Do
* not apply these to local buffers!
*/
extern uint32 LockBufHdr(BufferDesc *desc);
#define UnlockBufHdr(desc, s) \
do { \
pg_write_barrier(); \
pg_atomic_write_u32(&(desc)->state, (s) & (~BM_LOCKED)); \
} while (0)
/*
* The PendingWriteback & WritebackContext structure are used to keep
* information about pending flush requests to be issued to the OS.
@@ -276,11 +260,63 @@ typedef struct WritebackContext
/* in buf_init.c */
extern PGDLLIMPORT BufferDescPadded *BufferDescriptors;
extern PGDLLIMPORT ConditionVariableMinimallyPadded *BufferIOCVArray;
extern PGDLLIMPORT WritebackContext BackendWritebackContext;
/* in localbuf.c */
extern PGDLLIMPORT BufferDesc *LocalBufferDescriptors;
static inline BufferDesc *
GetBufferDescriptor(uint32 id)
{
return &(BufferDescriptors[id]).bufferdesc;
}
static inline BufferDesc *
GetLocalBufferDescriptor(uint32 id)
{
return &LocalBufferDescriptors[id];
}
static inline Buffer
BufferDescriptorGetBuffer(const BufferDesc *bdesc)
{
return (Buffer) (bdesc->buf_id + 1);
}
static inline ConditionVariable *
BufferDescriptorGetIOCV(const BufferDesc *bdesc)
{
return &(BufferIOCVArray[bdesc->buf_id]).cv;
}
static inline LWLock *
BufferDescriptorGetContentLock(const BufferDesc *bdesc)
{
return (LWLock *) (&bdesc->content_lock);
}
/*
* The freeNext field is either the index of the next freelist entry,
* or one of these special values:
*/
#define FREENEXT_END_OF_LIST (-1)
#define FREENEXT_NOT_IN_LIST (-2)
/*
* Functions for acquiring/releasing a shared buffer header's spinlock. Do
* not apply these to local buffers!
*/
extern uint32 LockBufHdr(BufferDesc *desc);
static inline void
UnlockBufHdr(BufferDesc *desc, uint32 buf_state)
{
pg_write_barrier();
pg_atomic_write_u32(&desc->state, buf_state & (~BM_LOCKED));
}
/* in bufmgr.c */
/*