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 <[email protected]>
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)