In lwlock.c, uses of LWLockCounter must first calculate its address in
shared memory with something like this:

        LWLockCounter = (int *) ((char *) MainLWLockArray - sizeof(int));

This appears to have been started by commit 82e861f in order to fix
EXEC_BACKEND builds, but it could also be fixed by adding it to the
BackendParameters struct.  I find the current approach somewhat difficult
to read and understand, so I'd like to switch to the latter approach.  This
is admittedly just nitpicking...

-- 
nathan
>From d4b1847f7e7d1ef4b32b4a5304b2a55cabe55f56 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <nat...@postgresql.org>
Date: Thu, 28 Aug 2025 16:22:02 -0500
Subject: [PATCH v1 1/1] Make LWLockCounter a global variable.

---
 src/backend/postmaster/launch_backend.c |  3 +++
 src/backend/storage/lmgr/lwlock.c       | 15 ++++-----------
 src/include/storage/lwlock.h            |  1 +
 3 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/backend/postmaster/launch_backend.c 
b/src/backend/postmaster/launch_backend.c
index bf6b55ee830..cd9547b03a3 100644
--- a/src/backend/postmaster/launch_backend.c
+++ b/src/backend/postmaster/launch_backend.c
@@ -102,6 +102,7 @@ typedef struct
 #endif
        int                     NamedLWLockTrancheRequests;
        NamedLWLockTranche *NamedLWLockTrancheArray;
+       int                *LWLockCounter;
        LWLockPadded *MainLWLockArray;
        slock_t    *ProcStructLock;
        PROC_HDR   *ProcGlobal;
@@ -761,6 +762,7 @@ save_backend_variables(BackendParameters *param,
 
        param->NamedLWLockTrancheRequests = NamedLWLockTrancheRequests;
        param->NamedLWLockTrancheArray = NamedLWLockTrancheArray;
+       param->LWLockCounter = LWLockCounter;
        param->MainLWLockArray = MainLWLockArray;
        param->ProcStructLock = ProcStructLock;
        param->ProcGlobal = ProcGlobal;
@@ -1021,6 +1023,7 @@ restore_backend_variables(BackendParameters *param)
 
        NamedLWLockTrancheRequests = param->NamedLWLockTrancheRequests;
        NamedLWLockTrancheArray = param->NamedLWLockTrancheArray;
+       LWLockCounter = param->LWLockCounter;
        MainLWLockArray = param->MainLWLockArray;
        ProcStructLock = param->ProcStructLock;
        ProcGlobal = param->ProcGlobal;
diff --git a/src/backend/storage/lmgr/lwlock.c 
b/src/backend/storage/lmgr/lwlock.c
index c80b43f1f55..09401515d3a 100644
--- a/src/backend/storage/lmgr/lwlock.c
+++ b/src/backend/storage/lmgr/lwlock.c
@@ -196,6 +196,7 @@ int                 NamedLWLockTrancheRequests = 0;
 
 /* points to data in shared memory: */
 NamedLWLockTranche *NamedLWLockTrancheArray = NULL;
+int               *LWLockCounter = NULL;
 
 static void InitializeLWLocks(void);
 static inline void LWLockReportWaitStart(LWLock *lock);
@@ -423,13 +424,14 @@ CreateLWLocks(void)
        if (!IsUnderPostmaster)
        {
                Size            spaceLocks = LWLockShmemSize();
-               int                *LWLockCounter;
                char       *ptr;
 
                /* Allocate space */
                ptr = (char *) ShmemAlloc(spaceLocks);
 
-               /* Leave room for dynamic allocation of tranches */
+               /* Initialize the dynamic-allocation counter for tranches */
+               LWLockCounter = (int *) ptr;
+               *LWLockCounter = LWTRANCHE_FIRST_USER_DEFINED;
                ptr += sizeof(int);
 
                /* Ensure desired alignment of LWLock array */
@@ -437,13 +439,6 @@ CreateLWLocks(void)
 
                MainLWLockArray = (LWLockPadded *) ptr;
 
-               /*
-                * Initialize the dynamic-allocation counter for tranches, 
which is
-                * stored just before the first LWLock.
-                */
-               LWLockCounter = (int *) ((char *) MainLWLockArray - 
sizeof(int));
-               *LWLockCounter = LWTRANCHE_FIRST_USER_DEFINED;
-
                /* Initialize all LWLocks */
                InitializeLWLocks();
        }
@@ -574,9 +569,7 @@ int
 LWLockNewTrancheId(void)
 {
        int                     result;
-       int                *LWLockCounter;
 
-       LWLockCounter = (int *) ((char *) MainLWLockArray - sizeof(int));
        /* We use the ShmemLock spinlock to protect LWLockCounter */
        SpinLockAcquire(ShmemLock);
        result = (*LWLockCounter)++;
diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h
index 5e717765764..f9cf57f8d26 100644
--- a/src/include/storage/lwlock.h
+++ b/src/include/storage/lwlock.h
@@ -82,6 +82,7 @@ typedef struct NamedLWLockTranche
 
 extern PGDLLIMPORT NamedLWLockTranche *NamedLWLockTrancheArray;
 extern PGDLLIMPORT int NamedLWLockTrancheRequests;
+extern PGDLLIMPORT int *LWLockCounter;
 
 /*
  * It's a bit odd to declare NUM_BUFFER_PARTITIONS and NUM_LOCK_PARTITIONS
-- 
2.39.5 (Apple Git-154)

Reply via email to