From f75f69379809f796bd8959d9d7e7d38277cacdd3 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Wed, 20 Nov 2024 04:07:28 +0100
Subject: [PATCH v0 3/4] Reduce size of PROCLOCK by 8 bytes on 64-bit systems

---
 src/include/storage/lock.h      |  2 +-
 src/backend/storage/lmgr/lock.c | 16 +++++++++-------
 src/backend/storage/lmgr/proc.c |  5 ++++-
 3 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h
index 345ded934f..b1d4f18402 100644
--- a/src/include/storage/lock.h
+++ b/src/include/storage/lock.h
@@ -386,7 +386,7 @@ typedef struct PROCLOCK
 	PROCLOCKTAG tag;			/* unique identifier of proclock object */
 
 	/* data */
-	PGPROC	   *groupLeader;	/* proc's lock group leader, or proc itself */
+	ProcNumber	groupLeader;	/* proc's lock group leader, or proc itself */
 	LOCKMASK	holdMask;		/* bitmask for lock types currently held */
 	LOCKMASK	releaseMask;	/* bitmask for lock types to be released */
 	dlist_node	lockLink;		/* list link in LOCK's list of proclocks */
diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c
index 65349b1196..15e1512e75 100644
--- a/src/backend/storage/lmgr/lock.c
+++ b/src/backend/storage/lmgr/lock.c
@@ -1321,6 +1321,7 @@ SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc,
 	if (!found)
 	{
 		uint32		partition = LockHashPartition(hashcode);
+		PGPROC	   *leaderProc;
 
 		/*
 		 * It might seem unsafe to access proclock->groupLeader without a
@@ -1332,8 +1333,9 @@ SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc,
 		 * lock group leader without first releasing all of its locks (and in
 		 * particular the one we are currently transferring).
 		 */
-		proclock->groupLeader = proc->lockGroupLeader != NULL ?
+		leaderProc = proc->lockGroupLeader != NULL ?
 			proc->lockGroupLeader : proc;
+		proclock->groupLeader = GetNumberFromPGProc(leaderProc);
 		proclock->holdMask = 0;
 		proclock->releaseMask = 0;
 		/* Add proclock to appropriate lists */
@@ -1535,7 +1537,7 @@ LockCheckConflicts(LockMethod lockMethodTable,
 	}
 
 	/* If no group locking, it's definitely a conflict. */
-	if (proclock->groupLeader == MyProc && MyProc->lockGroupLeader == NULL)
+	if (proclock->groupLeader == MyProcNumber && MyProc->lockGroupLeader == NULL)
 	{
 		Assert(proclock->tag.myProc == MyProc);
 		PROCLOCK_PRINT("LockCheckConflicts: conflicting (simple)",
@@ -3640,8 +3642,8 @@ PostPrepare_Locks(TransactionId xid)
 			 * Update groupLeader pointer to point to the new proc.  (We'd
 			 * better not be a member of somebody else's lock group!)
 			 */
-			Assert(proclock->groupLeader == proclock->tag.myProc);
-			proclock->groupLeader = newproc;
+			Assert(proclock->groupLeader == GetNumberFromPGProc(proclock->tag.myProc));
+			proclock->groupLeader = GetNumberFromPGProc(newproc);
 
 			/*
 			 * Update the proclock.  We should not find any existing entry for
@@ -3864,7 +3866,7 @@ GetLockStatusData(void)
 		instance->vxid.procNumber = proc->vxid.procNumber;
 		instance->vxid.localTransactionId = proc->vxid.lxid;
 		instance->pid = proc->pid;
-		instance->leaderPid = proclock->groupLeader->pid;
+		instance->leaderPid = GetPGProcByNumber(proclock->groupLeader)->pid;
 		instance->fastpath = false;
 		instance->waitStart = (TimestampTz) pg_atomic_read_u64(&proc->waitStart);
 
@@ -4040,7 +4042,7 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data)
 		instance->vxid.procNumber = proc->vxid.procNumber;
 		instance->vxid.localTransactionId = proc->vxid.lxid;
 		instance->pid = proc->pid;
-		instance->leaderPid = proclock->groupLeader->pid;
+		instance->leaderPid = GetPGProcByNumber(proclock->groupLeader)->pid;
 		instance->fastpath = false;
 		data->nlocks++;
 	}
@@ -4394,7 +4396,7 @@ lock_twophase_recover(TransactionId xid, uint16 info,
 	if (!found)
 	{
 		Assert(proc->lockGroupLeader == NULL);
-		proclock->groupLeader = proc;
+		proclock->groupLeader = GetNumberFromPGProc(proc);
 		proclock->holdMask = 0;
 		proclock->releaseMask = 0;
 		/* Add proclock to appropriate lists */
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index a359c0be21..43e79e07e2 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -1119,6 +1119,9 @@ JoinWaitQueue(LOCALLOCK *locallock, LockMethod lockMethodTable, bool dontWait)
 	if (leader != NULL)
 	{
 		dlist_iter	iter;
+		ProcNumber	leaderNo;
+
+		leaderNo = GetNumberFromPGProc(leader);
 
 		dlist_foreach(iter, &lock->procLocks)
 		{
@@ -1126,7 +1129,7 @@ JoinWaitQueue(LOCALLOCK *locallock, LockMethod lockMethodTable, bool dontWait)
 
 			otherproclock = dlist_container(PROCLOCK, lockLink, iter.cur);
 
-			if (otherproclock->groupLeader == leader)
+			if (otherproclock->groupLeader == leaderNo)
 				myHeldLocks |= otherproclock->holdMask;
 		}
 	}
-- 
2.45.2

