diff options
Diffstat (limited to 'src/backend/access/transam/multixact.c')
-rw-r--r-- | src/backend/access/transam/multixact.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 806f2e43ba9..f00c2725212 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -282,12 +282,11 @@ typedef struct MultiXactStateData } MultiXactStateData; /* - * Last element of OldestMemberMXactId and OldestVisibleMXactId arrays. - * Valid elements are (1..MaxOldestSlot); element 0 is never used. + * Pointers to the state data in shared memory + * + * The index of the last element of the OldestMemberMXactId and + * OldestVisibleMXacId arrays can be obtained with GetMaxOldestSlot(). */ -#define MaxOldestSlot (MaxBackends + max_prepared_xacts) - -/* Pointers to the state data in shared memory */ static MultiXactStateData *MultiXactState; static MultiXactId *OldestMemberMXactId; static MultiXactId *OldestVisibleMXactId; @@ -342,6 +341,7 @@ static void MultiXactIdSetOldestVisible(void); static void RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, int nmembers, MultiXactMember *members); static MultiXactId GetNewMultiXactId(int nmembers, MultiXactOffset *offset); +static inline int GetMaxOldestSlot(void); /* MultiXact cache management */ static int mxactMemberComparator(const void *arg1, const void *arg2); @@ -663,6 +663,17 @@ MultiXactIdSetOldestMember(void) } /* + * Retrieve the index of the last element of the OldestMemberMXactId and + * OldestVisibleMXactId arrays. Valid elements are (1..MaxOldestSlot); element + * 0 is never used. + */ +static inline int +GetMaxOldestSlot(void) +{ + return GetMaxBackends() + max_prepared_xacts; +} + +/* * MultiXactIdSetOldestVisible * Save the oldest MultiXactId this transaction considers possibly live. * @@ -684,6 +695,7 @@ MultiXactIdSetOldestVisible(void) if (!MultiXactIdIsValid(OldestVisibleMXactId[MyBackendId])) { MultiXactId oldestMXact; + int maxOldestSlot = GetMaxOldestSlot(); int i; LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); @@ -697,7 +709,7 @@ MultiXactIdSetOldestVisible(void) if (oldestMXact < FirstMultiXactId) oldestMXact = FirstMultiXactId; - for (i = 1; i <= MaxOldestSlot; i++) + for (i = 1; i <= maxOldestSlot; i++) { MultiXactId thisoldest = OldestMemberMXactId[i]; @@ -1831,7 +1843,7 @@ MultiXactShmemSize(void) /* We need 2*MaxOldestSlot + 1 perBackendXactIds[] entries */ #define SHARED_MULTIXACT_STATE_SIZE \ add_size(offsetof(MultiXactStateData, perBackendXactIds) + sizeof(MultiXactId), \ - mul_size(sizeof(MultiXactId) * 2, MaxOldestSlot)) + mul_size(sizeof(MultiXactId) * 2, GetMaxOldestSlot())) size = SHARED_MULTIXACT_STATE_SIZE; size = add_size(size, SimpleLruShmemSize(NUM_MULTIXACTOFFSET_BUFFERS, 0)); @@ -1882,7 +1894,7 @@ MultiXactShmemInit(void) * since we only use indexes 1..MaxOldestSlot in each array. */ OldestMemberMXactId = MultiXactState->perBackendXactIds; - OldestVisibleMXactId = OldestMemberMXactId + MaxOldestSlot; + OldestVisibleMXactId = OldestMemberMXactId + GetMaxOldestSlot(); } /* @@ -2507,6 +2519,7 @@ GetOldestMultiXactId(void) { MultiXactId oldestMXact; MultiXactId nextMXact; + int maxOldestSlot = GetMaxOldestSlot(); int i; /* @@ -2525,7 +2538,7 @@ GetOldestMultiXactId(void) nextMXact = FirstMultiXactId; oldestMXact = nextMXact; - for (i = 1; i <= MaxOldestSlot; i++) + for (i = 1; i <= maxOldestSlot; i++) { MultiXactId thisoldest; |