]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Move ShmemIndexLock into ShmemAllocator
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 26 Mar 2026 21:47:33 +0000 (23:47 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 26 Mar 2026 21:51:41 +0000 (23:51 +0200)
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

src/backend/storage/ipc/shmem.c
src/backend/utils/activity/wait_event_names.txt
src/include/storage/lwlocklist.h

index b3199082de25ce8bb74b837455261c3c0d69e7d8..3cc38450949f404ad0ec12e27ac625553a7e3abd 100644 (file)
 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;
index 4aa864fe3c3cf5c600812cf2853d6f4dab048d5b..6be80d2daad3b1a9b8d830c4e23d1f48ae711819 100644 (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.
 
index e94ebce95b9270943fbae816044276d8f3abf9e2..59ee097977d59cfbf58e66e4cb27cd78597c6392 100644 (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)