From 044b2ed516a466264282f5fe3a456e9f08934106 Mon Sep 17 00:00:00 2001
From: Maxim Orlov <orlovmg@gmail.com>
Date: Mon, 10 Oct 2022 17:11:52 +0300
Subject: [PATCH v1] Convert macros to static inline functions (transam.h)

---
 src/backend/access/heap/heapam.c            |  2 +-
 src/backend/access/transam/subtrans.c       |  2 +-
 src/backend/access/transam/varsup.c         |  2 +-
 src/backend/access/transam/xlog.c           |  4 ++--
 src/backend/replication/logical/snapbuild.c |  4 ++--
 src/backend/storage/ipc/procarray.c         | 20 ++++++++--------
 src/include/access/transam.h                | 26 +++++++++++++--------
 7 files changed, 33 insertions(+), 27 deletions(-)

diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index bd4d85041d3..94f0f2dd917 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -8944,7 +8944,7 @@ heap_xlog_freeze_page(XLogReaderState *record)
 		RelFileLocator rlocator;
 		TransactionId latestRemovedXid = cutoff_xid;
 
-		TransactionIdRetreat(latestRemovedXid);
+		TransactionIdRetreat(&latestRemovedXid);
 
 		XLogRecGetBlockTag(record, 0, &rlocator, NULL, NULL);
 		ResolveRecoveryConflictWithSnapshot(latestRemovedXid, rlocator);
diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c
index 66d35481552..cb479d41679 100644
--- a/src/backend/access/transam/subtrans.c
+++ b/src/backend/access/transam/subtrans.c
@@ -347,7 +347,7 @@ TruncateSUBTRANS(TransactionId oldestXact)
 	 * a page and oldestXact == next XID.  In that case, if we didn't subtract
 	 * one, we'd trigger SimpleLruTruncate's wraparound detection.
 	 */
-	TransactionIdRetreat(oldestXact);
+	TransactionIdRetreat(&oldestXact);
 	cutoffPage = TransactionIdToPage(oldestXact);
 
 	SimpleLruTruncate(SubTransCtl, cutoffPage);
diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c
index 849a7ce9d6d..44313167171 100644
--- a/src/backend/access/transam/varsup.c
+++ b/src/backend/access/transam/varsup.c
@@ -300,7 +300,7 @@ AdvanceNextFullTransactionIdPastXid(TransactionId xid)
 	 * because the span of active xids cannot exceed one epoch at any given
 	 * point in the WAL stream.
 	 */
-	TransactionIdAdvance(xid);
+	TransactionIdAdvance(&xid);
 	epoch = EpochFromFullTransactionId(ShmemVariableCache->nextXid);
 	if (unlikely(xid < next_xid))
 		++epoch;
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 27085b15a83..6835b9a24f8 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -5448,7 +5448,7 @@ StartupXLOG(void)
 				running.nextXid = XidFromFullTransactionId(checkPoint.nextXid);
 				running.oldestRunningXid = oldestActiveXID;
 				latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid);
-				TransactionIdRetreat(latestCompletedXid);
+				TransactionIdRetreat(&latestCompletedXid);
 				Assert(TransactionIdIsNormal(latestCompletedXid));
 				running.latestCompletedXid = latestCompletedXid;
 				running.xids = xids;
@@ -7820,7 +7820,7 @@ xlog_redo(XLogReaderState *record)
 			running.nextXid = XidFromFullTransactionId(checkPoint.nextXid);
 			running.oldestRunningXid = oldestActiveXID;
 			latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid);
-			TransactionIdRetreat(latestCompletedXid);
+			TransactionIdRetreat(&latestCompletedXid);
 			Assert(TransactionIdIsNormal(latestCompletedXid));
 			running.latestCompletedXid = latestCompletedXid;
 			running.xids = xids;
diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c
index 54499c06fe9..a0f376689f6 100644
--- a/src/backend/replication/logical/snapbuild.c
+++ b/src/backend/replication/logical/snapbuild.c
@@ -634,7 +634,7 @@ SnapBuildInitialSnapshot(SnapBuild *builder)
 			newxip[newxcnt++] = xid;
 		}
 
-		TransactionIdAdvance(xid);
+		TransactionIdAdvance(&xid);
 	}
 
 	/* adjust remaining snapshot fields as needed */
@@ -1126,7 +1126,7 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid,
 		 TransactionIdFollowsOrEquals(xmax, builder->xmax)))
 	{
 		builder->xmax = xmax;
-		TransactionIdAdvance(builder->xmax);
+		TransactionIdAdvance(&builder->xmax);
 	}
 
 	/* if there's any reason to build a historic snapshot, do so now */
diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 207c4b27fdf..3cddcaafb4e 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -1023,7 +1023,7 @@ ProcArrayInitRecovery(TransactionId initializedUptoXID)
 	 * ProcArrayApplyRecoveryInfo().
 	 */
 	latestObservedXid = initializedUptoXID;
-	TransactionIdRetreat(latestObservedXid);
+	TransactionIdRetreat(&latestObservedXid);
 }
 
 /*
@@ -1216,13 +1216,13 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running)
 	 * haven't gone through RecordKnownAssignedTransactionId().
 	 */
 	Assert(TransactionIdIsNormal(latestObservedXid));
-	TransactionIdAdvance(latestObservedXid);
+	TransactionIdAdvance(&latestObservedXid);
 	while (TransactionIdPrecedes(latestObservedXid, running->nextXid))
 	{
 		ExtendSUBTRANS(latestObservedXid);
-		TransactionIdAdvance(latestObservedXid);
+		TransactionIdAdvance(&latestObservedXid);
 	}
-	TransactionIdRetreat(latestObservedXid);	/* = running->nextXid - 1 */
+	TransactionIdRetreat(&latestObservedXid);	/* = running->nextXid - 1 */
 
 	/* ----------
 	 * Now we've got the running xids we need to set the global values that
@@ -1733,7 +1733,7 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h)
 
 		initial = XidFromFullTransactionId(h->latest_completed);
 		Assert(TransactionIdIsValid(initial));
-		TransactionIdAdvance(initial);
+		TransactionIdAdvance(&initial);
 
 		h->oldest_considered_running = initial;
 		h->shared_oldest_nonremovable = initial;
@@ -2274,7 +2274,7 @@ GetSnapshotData(Snapshot snapshot)
 
 	/* xmax is always latestCompletedXid + 1 */
 	xmax = XidFromFullTransactionId(latest_completed);
-	TransactionIdAdvance(xmax);
+	TransactionIdAdvance(&xmax);
 	Assert(TransactionIdIsNormal(xmax));
 
 	/* initialize xmin calculation with xmax */
@@ -4400,7 +4400,7 @@ RecordKnownAssignedTransactionIds(TransactionId xid)
 		next_expected_xid = latestObservedXid;
 		while (TransactionIdPrecedes(next_expected_xid, xid))
 		{
-			TransactionIdAdvance(next_expected_xid);
+			TransactionIdAdvance(&next_expected_xid);
 			ExtendSUBTRANS(next_expected_xid);
 		}
 		Assert(next_expected_xid == xid);
@@ -4419,7 +4419,7 @@ RecordKnownAssignedTransactionIds(TransactionId xid)
 		 * Add (latestObservedXid, xid] onto the KnownAssignedXids array.
 		 */
 		next_expected_xid = latestObservedXid;
-		TransactionIdAdvance(next_expected_xid);
+		TransactionIdAdvance(&next_expected_xid);
 		KnownAssignedXidsAdd(next_expected_xid, xid, false);
 
 		/*
@@ -4685,7 +4685,7 @@ KnownAssignedXidsAdd(TransactionId from_xid, TransactionId to_xid,
 		while (TransactionIdPrecedes(next_xid, to_xid))
 		{
 			nxids++;
-			TransactionIdAdvance(next_xid);
+			TransactionIdAdvance(&next_xid);
 		}
 	}
 
@@ -4741,7 +4741,7 @@ KnownAssignedXidsAdd(TransactionId from_xid, TransactionId to_xid,
 	{
 		KnownAssignedXids[head] = next_xid;
 		KnownAssignedXidsValid[head] = true;
-		TransactionIdAdvance(next_xid);
+		TransactionIdAdvance(&next_xid);
 		head++;
 	}
 
diff --git a/src/include/access/transam.h b/src/include/access/transam.h
index 775471d2a7d..5352d22a9bb 100644
--- a/src/include/access/transam.h
+++ b/src/include/access/transam.h
@@ -88,12 +88,14 @@ FullTransactionIdFromU64(uint64 value)
 }
 
 /* advance a transaction ID variable, handling wraparound correctly */
-#define TransactionIdAdvance(dest)	\
-	do { \
-		(dest)++; \
-		if ((dest) < FirstNormalTransactionId) \
-			(dest) = FirstNormalTransactionId; \
-	} while(0)
+static inline void
+TransactionIdAdvance(TransactionId *dest)
+{
+	(*dest)++;
+
+	if (*dest < FirstNormalTransactionId)
+		*dest = FirstNormalTransactionId;
+}
 
 /*
  * Retreat a FullTransactionId variable, stepping over xids that would appear
@@ -138,10 +140,14 @@ FullTransactionIdAdvance(FullTransactionId *dest)
 }
 
 /* back up a transaction ID variable, handling wraparound correctly */
-#define TransactionIdRetreat(dest)	\
-	do { \
-		(dest)--; \
-	} while ((dest) < FirstNormalTransactionId)
+static inline void
+TransactionIdRetreat(TransactionId *dest)
+{
+	(*dest)--;
+
+	 while (*dest < FirstNormalTransactionId)
+		(*dest)--;
+}
 
 /* compare two XIDs already known to be normal; this is a macro for speed */
 #define NormalTransactionIdPrecedes(id1, id2) \
-- 
2.37.0 (Apple Git-136)

