diff options
author | Robert Haas <rhaas@postgresql.org> | 2022-07-27 13:54:37 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2022-07-27 13:54:37 -0400 |
commit | 3ac88fddd92cc3fd8475a2f5f33837dc18d2057b (patch) | |
tree | 5a9bc612c5fa4a58376661a8a33d3b6fbda014b6 /src/include | |
parent | 03361a368e7bf909283cc7721af004317fdabd3d (diff) | |
download | postgresql-3ac88fddd92cc3fd8475a2f5f33837dc18d2057b.tar.gz postgresql-3ac88fddd92cc3fd8475a2f5f33837dc18d2057b.zip |
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
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/storage/buf_internals.h | 158 |
1 files changed, 97 insertions, 61 deletions
diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index 69e45900bae..72466551d71 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -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 \ -) - -#define INIT_BUFFERTAG(a,xx_rlocator,xx_forkNum,xx_blockNum) \ -( \ - (a).rlocator = (xx_rlocator), \ - (a).forkNum = (xx_forkNum), \ - (a).blockNum = (xx_blockNum) \ -) - -#define BUFFERTAGS_EQUAL(a,b) \ -( \ - RelFileLocatorEquals((a).rlocator, (b).rlocator) && \ - (a).blockNum == (b).blockNum && \ - (a).forkNum == (b).forkNum \ -) +static inline void +ClearBufferTag(BufferTag *tag) +{ + tag->rlocator.spcOid = InvalidOid; + tag->rlocator.dbOid = InvalidOid; + tag->rlocator.relNumber = InvalidRelFileNumber; + tag->forkNum = InvalidForkNumber; + tag->blockNum = InvalidBlockNumber; +} + +static inline void +InitBufferTag(BufferTag *tag, const RelFileLocator *rlocator, + ForkNumber forkNum, BlockNumber blockNum) +{ + tag->rlocator = *rlocator; + tag->forkNum = forkNum; + tag->blockNum = blockNum; +} + +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 */ /* |