While trying to understand the extent of our spinlock usage, I noticed that
WaitEventCustomCounterData->mutex is unnecessary because the counter is
only ever accessed with WaitEventCustomLock held exclusively.  So, here's a
patch to simplify matters a bit.  Thoughts?

-- 
nathan
>From 6fe5fb011363d1fc96f97412e0665d13216147b6 Mon Sep 17 00:00:00 2001
From: Nathan Bossart <[email protected]>
Date: Wed, 8 Jul 2026 21:50:04 -0500
Subject: [PATCH v1 1/1] remove WaitEventCustomCounterData

---
 src/backend/utils/activity/wait_event.c | 29 ++++++-------------------
 src/tools/pgindent/typedefs.list        |  1 -
 2 files changed, 7 insertions(+), 23 deletions(-)

diff --git a/src/backend/utils/activity/wait_event.c 
b/src/backend/utils/activity/wait_event.c
index 95635c7f56c..7ee6f99fb50 100644
--- a/src/backend/utils/activity/wait_event.c
+++ b/src/backend/utils/activity/wait_event.c
@@ -81,14 +81,7 @@ typedef struct WaitEventCustomEntryByName
 
 
 /* dynamic allocation counter for custom wait events */
-typedef struct WaitEventCustomCounterData
-{
-       int                     nextId;                 /* next ID to assign */
-       slock_t         mutex;                  /* protects the counter */
-} WaitEventCustomCounterData;
-
-/* pointer to the shared memory */
-static WaitEventCustomCounterData *WaitEventCustomCounter;
+static int *WaitEventCustomCounter;
 
 /* first event ID of custom wait events */
 #define WAIT_EVENT_CUSTOM_INITIAL_ID   1
@@ -110,8 +103,8 @@ const ShmemCallbacks WaitEventCustomShmemCallbacks = {
 static void
 WaitEventCustomShmemRequest(void *arg)
 {
-       ShmemRequestStruct(.name = "WaitEventCustomCounterData",
-                                          .size = 
sizeof(WaitEventCustomCounterData),
+       ShmemRequestStruct(.name = "WaitEventCustomCounter",
+                                          .size = sizeof(int),
                                           .ptr = (void **) 
&WaitEventCustomCounter,
                );
        ShmemRequestHash(.name = "WaitEventCustom hash by wait event 
information",
@@ -134,9 +127,8 @@ WaitEventCustomShmemRequest(void *arg)
 static void
 WaitEventCustomShmemInit(void *arg)
 {
-       /* initialize the allocation counter and its spinlock. */
-       WaitEventCustomCounter->nextId = WAIT_EVENT_CUSTOM_INITIAL_ID;
-       SpinLockInit(&WaitEventCustomCounter->mutex);
+       /* initialize the allocation counter */
+       *WaitEventCustomCounter = WAIT_EVENT_CUSTOM_INITIAL_ID;
 }
 
 /*
@@ -221,19 +213,12 @@ WaitEventCustomNew(uint32 classId, const char 
*wait_event_name)
        }
 
        /* Allocate a new event Id */
-       SpinLockAcquire(&WaitEventCustomCounter->mutex);
-
-       if (WaitEventCustomCounter->nextId >= WAIT_EVENT_CUSTOM_HASH_SIZE)
-       {
-               SpinLockRelease(&WaitEventCustomCounter->mutex);
+       if (*WaitEventCustomCounter >= WAIT_EVENT_CUSTOM_HASH_SIZE)
                ereport(ERROR,
                                errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
                                errmsg("too many custom wait events"));
-       }
-
-       eventId = WaitEventCustomCounter->nextId++;
 
-       SpinLockRelease(&WaitEventCustomCounter->mutex);
+       eventId = (*WaitEventCustomCounter)++;
 
        /* Register the new wait event */
        wait_event_info = classId | eventId;
diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list
index ffb413ab612..3174e0e4ab8 100644
--- a/src/tools/pgindent/typedefs.list
+++ b/src/tools/pgindent/typedefs.list
@@ -3418,7 +3418,6 @@ WaitEvent
 WaitEventActivity
 WaitEventBuffer
 WaitEventClient
-WaitEventCustomCounterData
 WaitEventCustomEntryByInfo
 WaitEventCustomEntryByName
 WaitEventIO
-- 
2.50.1 (Apple Git-155)

Reply via email to