From ce41749e7df8339b5c1c90a42336f45d440028bb Mon Sep 17 00:00:00 2001 From: Maxim Orlov 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