From 4a3c54cadd459d4ac6b65e7b323775d84714649b Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Tue, 10 Mar 2026 17:37:29 +1300
Subject: [PATCH v2 11/19] Use stack buffer in transam/xact.c.

---
 src/backend/access/transam/xact.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index aafc53e0164..91adced5fb9 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -69,6 +69,7 @@
 #include "utils/memutils.h"
 #include "utils/relmapper.h"
 #include "utils/snapmgr.h"
+#include "utils/stack_buffer.h"
 #include "utils/timeout.h"
 #include "utils/timestamp.h"
 #include "utils/typcache.h"
@@ -640,6 +641,8 @@ AssignTransactionId(TransactionState s)
 	ResourceOwner currentOwner;
 	bool		log_unknown_top = false;
 
+	DECLARE_STACK_BUFFER();
+
 	/* Assert that caller didn't screw up */
 	Assert(!FullTransactionIdIsValid(s->fullTransactionId));
 	Assert(s->state == TRANS_INPROGRESS);
@@ -665,7 +668,7 @@ AssignTransactionId(TransactionState s)
 		TransactionState *parents;
 		size_t		parentOffset = 0;
 
-		parents = palloc_array(TransactionState, s->nestingLevel);
+		parents = stack_buffer_alloc_array(TransactionState, s->nestingLevel);
 		while (p != NULL && !FullTransactionIdIsValid(p->fullTransactionId))
 		{
 			parents[parentOffset++] = p;
@@ -679,7 +682,7 @@ AssignTransactionId(TransactionState s)
 		while (parentOffset != 0)
 			AssignTransactionId(parents[--parentOffset]);
 
-		pfree(parents);
+		stack_buffer_free(parents);
 	}
 
 	/*
@@ -5568,6 +5571,8 @@ SerializeTransactionState(Size maxsize, char *start_address)
 	TransactionId *workspace;
 	SerializedTransactionState *result;
 
+	DECLARE_STACK_BUFFER();
+
 	result = (SerializedTransactionState *) start_address;
 
 	result->xactIsoLevel = XactIsoLevel;
@@ -5604,7 +5609,7 @@ SerializeTransactionState(Size maxsize, char *start_address)
 		   <= maxsize);
 
 	/* Copy them to our scratch space. */
-	workspace = palloc(nxids * sizeof(TransactionId));
+	workspace = stack_buffer_alloc_array(TransactionId, nxids);
 	for (s = CurrentTransactionState; s != NULL; s = s->parent)
 	{
 		if (FullTransactionIdIsValid(s->fullTransactionId))
@@ -5623,6 +5628,8 @@ SerializeTransactionState(Size maxsize, char *start_address)
 	result->nParallelCurrentXids = nxids;
 	memcpy(&result->parallelCurrentXids[0], workspace,
 		   nxids * sizeof(TransactionId));
+
+	stack_buffer_free(workspace);
 }
 
 /*
-- 
2.53.0

