v2-0001-Avoid-double-spinlock-release.patch

application/octet-stream

Filename: v2-0001-Avoid-double-spinlock-release.patch
Type: application/octet-stream
Part: 0
Message: Re: Spinlock can be released twice in procsignal.c

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: format-patch
Series: patch v2-0001
Subject: Avoid double spinlock release
File+
src/backend/storage/ipc/procsignal.c 8 6
From ce41749e7df8339b5c1c90a42336f45d440028bb Mon Sep 17 00:00:00 2001
From: Maxim Orlov <orlovmg@gmail.com>
Date: Wed, 26 Feb 2025 09:42:43 +0300
Subject: [PATCH v2] Avoid double spinlock release

---
 src/backend/storage/ipc/procsignal.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c
index 7401b6e625e..6e9f9c0f2e5 100644
--- a/src/backend/storage/ipc/procsignal.c
+++ b/src/backend/storage/ipc/procsignal.c
@@ -167,6 +167,7 @@ ProcSignalInit(bool cancel_key_valid, int32 cancel_key)
 {
 	ProcSignalSlot *slot;
 	uint64		barrier_generation;
+	bool		logit;
 
 	if (MyProcNumber < 0)
 		elog(ERROR, "MyProcNumber not set");
@@ -176,12 +177,7 @@ ProcSignalInit(bool cancel_key_valid, int32 cancel_key)
 
 	/* sanity check */
 	SpinLockAcquire(&slot->pss_mutex);
-	if (pg_atomic_read_u32(&slot->pss_pid) != 0)
-	{
-		SpinLockRelease(&slot->pss_mutex);
-		elog(LOG, "process %d taking over ProcSignal slot %d, but it's not empty",
-			 MyProcPid, MyProcNumber);
-	}
+	logit = pg_atomic_read_u32(&slot->pss_pid) != 0;
 
 	/* Clear out any leftover signal reasons */
 	MemSet(slot->pss_signalFlags, 0, NUM_PROCSIGNALS * sizeof(sig_atomic_t));
@@ -208,6 +204,12 @@ ProcSignalInit(bool cancel_key_valid, int32 cancel_key)
 
 	SpinLockRelease(&slot->pss_mutex);
 
+	if (logit)
+	{
+		elog(LOG, "process %d taking over ProcSignal slot %d, but it's not empty",
+			 MyProcPid, MyProcNumber);
+	}
+
 	/* Remember slot location for CheckProcSignal */
 	MyProcSignalSlot = slot;
 
-- 
2.48.1