Move ShmemIndexLock into ShmemAllocator

This makes shmem.c independent of the main LWLock array. That makes it
possible to stop passing MainLWLockArray through BackendParameters in
the next commit.

Reviewed-by: Nathan Bossart <nathandbossart@gmail.com>
Discussion: https://www.postgresql.org/message-id/47aaf57e-1b7b-4e12-bda2-0316081ff50e@iki.fi
This commit is contained in:
Heikki Linnakangas 2026-03-26 23:47:33 +02:00
parent 12e3e0f2c8
commit 06d859aaf4
3 changed files with 13 additions and 7 deletions

View file

@ -90,12 +90,16 @@
typedef struct ShmemAllocatorData
{
Size free_offset; /* offset to first free space from ShmemBase */
HASHHDR *index; /* location of ShmemIndex */
/* protects shared memory and LWLock allocation */
/* protects 'free_offset' */
slock_t shmem_lock;
HASHHDR *index; /* location of ShmemIndex */
LWLock index_lock; /* protects ShmemIndex */
} ShmemAllocatorData;
#define ShmemIndexLock (&ShmemAllocator->index_lock)
static void *ShmemAllocRaw(Size size, Size *allocated_size);
/* shared memory global variables */
@ -154,15 +158,16 @@ InitShmemAllocator(PGShmemHeader *seghdr)
/*
* In postmaster or stand-alone backend, initialize the shared memory
* allocator and the spinlock so that we can allocate shared memory for
* ShmemIndex using ShmemAlloc(). In a regular backend just set up the
* pointers required by ShmemAlloc().
* allocator so that we can allocate shared memory for ShmemIndex using
* ShmemAlloc(). In a regular backend just set up the pointers required
* by ShmemAlloc().
*/
ShmemAllocator = (ShmemAllocatorData *) ((char *) seghdr + seghdr->content_offset);
if (!IsUnderPostmaster)
{
SpinLockInit(&ShmemAllocator->shmem_lock);
ShmemAllocator->free_offset = offset;
LWLockInitialize(&ShmemAllocator->index_lock, LWTRANCHE_SHMEM_INDEX);
}
ShmemSegHdr = seghdr;

View file

@ -321,7 +321,6 @@ ABI_compatibility:
Section: ClassName - WaitEventLWLock
ShmemIndex "Waiting to find or allocate space in shared memory."
OidGen "Waiting to allocate a new OID."
XidGen "Waiting to allocate a new transaction ID."
ProcArray "Waiting to access the shared per-process data structures (typically, to get a snapshot or report a session's transaction ID)."
@ -412,6 +411,7 @@ SubtransSLRU "Waiting to access the sub-transaction SLRU cache."
XactSLRU "Waiting to access the transaction status SLRU cache."
ParallelVacuumDSA "Waiting for parallel vacuum dynamic shared memory allocation."
AioUringCompletion "Waiting for another process to complete IO via io_uring."
ShmemIndex "Waiting to find or allocate space in shared memory."
# No "ABI_compatibility" region here as WaitEventLWLock has its own C code.

View file

@ -32,7 +32,7 @@
*/
/* 0 is available; was formerly BufFreelistLock */
PG_LWLOCK(1, ShmemIndex)
/* 1 was ShmemIndex */
PG_LWLOCK(2, OidGen)
PG_LWLOCK(3, XidGen)
PG_LWLOCK(4, ProcArray)
@ -137,3 +137,4 @@ PG_LWLOCKTRANCHE(SUBTRANS_SLRU, SubtransSLRU)
PG_LWLOCKTRANCHE(XACT_SLRU, XactSLRU)
PG_LWLOCKTRANCHE(PARALLEL_VACUUM_DSA, ParallelVacuumDSA)
PG_LWLOCKTRANCHE(AIO_URING_COMPLETION, AioUringCompletion)
PG_LWLOCKTRANCHE(SHMEM_INDEX, ShmemIndex)