From 415344731b62c2095f165acc5f0c4f7750458b21 Mon Sep 17 00:00:00 2001 From: Maxim Orlov Date: Fri, 14 Jun 2024 15:41:12 +0300 Subject: [PATCH v1 3/3] Switch from macro functions to inline in multixact. Author: Maxim Orlov Reviewed-by: ... Discussions: https://www.postgresql.org/message-id/ff143b24-a093-40da-9833-d36b83726bdf%40iki.fi --- src/backend/access/transam/multixact.c | 84 ++++++++++++++++++++------ 1 file changed, 65 insertions(+), 19 deletions(-) diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 53a81b3ef9..bcbee48270 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -108,11 +108,23 @@ /* We need four bytes per offset */ #define MULTIXACT_OFFSETS_PER_PAGE (BLCKSZ / sizeof(MultiXactOffset)) -#define MultiXactIdToOffsetPage(multi) \ - ((multi) / (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE) -#define MultiXactIdToOffsetEntry(multi) \ - ((multi) % (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE) -#define MultiXactIdToOffsetSegment(multi) (MultiXactIdToOffsetPage(multi) / SLRU_PAGES_PER_SEGMENT) +static inline int64 +MultiXactIdToOffsetPage(MultiXactId multi) +{ + return multi / MULTIXACT_OFFSETS_PER_PAGE; +} + +static inline int +MultiXactIdToOffsetEntry(MultiXactId multi) +{ + return multi % MULTIXACT_OFFSETS_PER_PAGE; +} + +static inline int +MultiXactIdToOffsetSegment(MultiXactId multi) +{ + return MultiXactIdToOffsetPage(multi) / SLRU_PAGES_PER_SEGMENT; +} /* * The situation for members is a bit more complex: we store one byte of @@ -156,30 +168,64 @@ ((uint32) ((0xFFFFFFFF % MULTIXACT_MEMBERS_PER_PAGE) + 1)) /* page in which a member is to be found */ -#define MXOffsetToMemberPage(offset) ((offset) / (MultiXactOffset) MULTIXACT_MEMBERS_PER_PAGE) -#define MXOffsetToMemberSegment(offset) (MXOffsetToMemberPage(offset) / SLRU_PAGES_PER_SEGMENT) +static inline int64 +MXOffsetToMemberPage(MultiXactOffset offset) +{ + return offset / MULTIXACT_MEMBERS_PER_PAGE; +} + +static inline int +MXOffsetToMemberSegment(MultiXactOffset offset) +{ + return MXOffsetToMemberPage(offset) / SLRU_PAGES_PER_SEGMENT; +} /* Location (byte offset within page) of flag word for a given member */ -#define MXOffsetToFlagsOffset(offset) \ - ((((offset) / (MultiXactOffset) MULTIXACT_MEMBERS_PER_MEMBERGROUP) % \ - (MultiXactOffset) MULTIXACT_MEMBERGROUPS_PER_PAGE) * \ - (MultiXactOffset) MULTIXACT_MEMBERGROUP_SIZE) -#define MXOffsetToFlagsBitShift(offset) \ - (((offset) % (MultiXactOffset) MULTIXACT_MEMBERS_PER_MEMBERGROUP) * \ - MXACT_MEMBER_BITS_PER_XACT) +static inline int +MXOffsetToFlagsOffset(MultiXactOffset offset) +{ + int flagsoff; + + offset /= MULTIXACT_MEMBERS_PER_MEMBERGROUP; + offset %= MULTIXACT_MEMBERGROUPS_PER_PAGE; + flagsoff = offset * MULTIXACT_MEMBERGROUP_SIZE; + + return flagsoff; +} + +static inline int +MXOffsetToFlagsBitShift(MultiXactOffset offset) +{ + int bshift; + + offset %= MULTIXACT_MEMBERS_PER_MEMBERGROUP; + bshift = offset * MXACT_MEMBER_BITS_PER_XACT; + + return bshift; +} /* Location (byte offset within page) of TransactionId of given member */ -#define MXOffsetToMemberOffset(offset) \ - (MXOffsetToFlagsOffset(offset) + MULTIXACT_FLAGBYTES_PER_GROUP + \ - ((offset) % MULTIXACT_MEMBERS_PER_MEMBERGROUP) * sizeof(TransactionId)) +static inline int +MXOffsetToMemberOffset(MultiXactOffset offset) +{ + int memberoff; + + memberoff = MXOffsetToFlagsOffset(offset) + MULTIXACT_FLAGBYTES_PER_GROUP + + (offset % MULTIXACT_MEMBERS_PER_MEMBERGROUP) * sizeof(TransactionId); + + return memberoff; +} /* Multixact members wraparound thresholds. */ #define MULTIXACT_MEMBER_SAFE_THRESHOLD (MaxMultiXactOffset / 2) #define MULTIXACT_MEMBER_DANGER_THRESHOLD \ (MaxMultiXactOffset - MaxMultiXactOffset / 4) -#define PreviousMultiXactId(multi) \ - ((multi) == FirstMultiXactId ? MaxMultiXactId : (multi) - 1) +static inline MultiXactId +PreviousMultiXactId(MultiXactId multi) +{ + return multi == FirstMultiXactId ? MaxMultiXactId : multi - 1; +} /* * Links to shared-memory data structures for MultiXact control -- 2.44.0