0008-Replace-ProcSendSignal-ProcWaitForSignal-with-new-in.patch
text/x-patch
Filename: 0008-Replace-ProcSendSignal-ProcWaitForSignal-with-new-in.patch
Type: text/x-patch
Part: 7
Message:
Re: Interrupts vs signals
Patch
Format: format-patch
Series: patch 0008
Subject: Replace ProcSendSignal/ProcWaitForSignal with new interrupt functions
| File | + | − |
|---|---|---|
| src/backend/storage/buffer/bufmgr.c | 3 | 2 |
| src/backend/storage/ipc/standby.c | 6 | 3 |
| src/backend/storage/lmgr/predicate.c | 3 | 2 |
| src/backend/storage/lmgr/proc.c | 0 | 28 |
| src/include/storage/proc.h | 0 | 3 |
From 9e704efaff17e7829b6913f55213e8347df85d9b Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Sat, 24 Aug 2024 00:58:05 +0300
Subject: [PATCH 08/11] Replace ProcSendSignal/ProcWaitForSignal with new
interrupt functions
---
src/backend/storage/buffer/bufmgr.c | 5 +++--
src/backend/storage/ipc/standby.c | 9 ++++++---
src/backend/storage/lmgr/predicate.c | 5 +++--
src/backend/storage/lmgr/proc.c | 28 ----------------------------
src/include/storage/proc.h | 3 ---
5 files changed, 12 insertions(+), 38 deletions(-)
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index fb38c7bdd4..3e335b0944 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -2891,7 +2891,7 @@ UnpinBufferNoOwner(BufferDesc *buf)
buf_state &= ~BM_PIN_COUNT_WAITER;
UnlockBufHdr(buf, buf_state);
- ProcSendSignal(wait_backend_pgprocno);
+ SendInterrupt(INTERRUPT_GENERAL_WAKEUP, wait_backend_pgprocno);
}
else
UnlockBufHdr(buf, buf_state);
@@ -5353,7 +5353,8 @@ LockBufferForCleanup(Buffer buffer)
SetStartupBufferPinWaitBufId(-1);
}
else
- ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN);
+ WaitInterrupt(1 << INTERRUPT_GENERAL_WAKEUP, WL_INTERRUPT | WL_EXIT_ON_PM_DEATH, 0,
+ WAIT_EVENT_BUFFER_PIN);
/*
* Remove flag marking us as waiter. Normally this will not be set
diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c
index 872679ca44..437b13da90 100644
--- a/src/backend/storage/ipc/standby.c
+++ b/src/backend/storage/ipc/standby.c
@@ -696,7 +696,8 @@ ResolveRecoveryConflictWithLock(LOCKTAG locktag, bool logging_conflict)
}
/* Wait to be signaled by the release of the Relation Lock */
- ProcWaitForSignal(PG_WAIT_LOCK | locktag.locktag_type);
+ WaitInterrupt(1 << INTERRUPT_GENERAL_WAKEUP, WL_INTERRUPT | WL_EXIT_ON_PM_DEATH, 0,
+ PG_WAIT_LOCK | locktag.locktag_type);
/*
* Exit if ltime is reached. Then all the backends holding conflicting
@@ -745,7 +746,8 @@ ResolveRecoveryConflictWithLock(LOCKTAG locktag, bool logging_conflict)
* until the relation locks are released or ltime is reached.
*/
got_standby_deadlock_timeout = false;
- ProcWaitForSignal(PG_WAIT_LOCK | locktag.locktag_type);
+ WaitInterrupt(1 << INTERRUPT_GENERAL_WAKEUP, WL_INTERRUPT | WL_EXIT_ON_PM_DEATH, 0,
+ PG_WAIT_LOCK | locktag.locktag_type);
}
cleanup:
@@ -839,7 +841,8 @@ ResolveRecoveryConflictWithBufferPin(void)
* SIGHUP signal handler, etc cannot do that because it uses the different
* latch from that ProcWaitForSignal() waits on.
*/
- ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN);
+ WaitInterrupt(1 << INTERRUPT_GENERAL_WAKEUP, WL_INTERRUPT | WL_EXIT_ON_PM_DEATH, 0,
+ WAIT_EVENT_BUFFER_PIN);
if (got_standby_delay_timeout)
SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN);
diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c
index b455b78f9f..f0234269b6 100644
--- a/src/backend/storage/lmgr/predicate.c
+++ b/src/backend/storage/lmgr/predicate.c
@@ -1571,7 +1571,8 @@ GetSafeSnapshot(Snapshot origSnapshot)
SxactIsROUnsafe(MySerializableXact)))
{
LWLockRelease(SerializableXactHashLock);
- ProcWaitForSignal(WAIT_EVENT_SAFE_SNAPSHOT);
+ WaitInterrupt(1 << INTERRUPT_GENERAL_WAKEUP, WL_INTERRUPT | WL_EXIT_ON_PM_DEATH, 0,
+ WAIT_EVENT_SAFE_SNAPSHOT);
LWLockAcquire(SerializableXactHashLock, LW_EXCLUSIVE);
}
MySerializableXact->flags &= ~SXACT_FLAG_DEFERRABLE_WAITING;
@@ -3604,7 +3605,7 @@ ReleasePredicateLocks(bool isCommit, bool isReadOnlySafe)
*/
if (SxactIsDeferrableWaiting(roXact) &&
(SxactIsROUnsafe(roXact) || SxactIsROSafe(roXact)))
- ProcSendSignal(roXact->pgprocno);
+ SendInterrupt(INTERRUPT_GENERAL_WAKEUP, roXact->pgprocno);
}
}
diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c
index f4fe4e873f..a7c258fd17 100644
--- a/src/backend/storage/lmgr/proc.c
+++ b/src/backend/storage/lmgr/proc.c
@@ -1866,34 +1866,6 @@ CheckDeadLockAlert(void)
errno = save_errno;
}
-/*
- * ProcWaitForSignal - wait for a signal from another backend.
- *
- * As this uses the generic process interurpt the caller has to be robust against
- * unrelated wakeups: Always check that the desired state has occurred, and
- * wait again if not.
- */
-void
-ProcWaitForSignal(uint32 wait_event_info)
-{
- (void) WaitInterrupt(1 << INTERRUPT_GENERAL_WAKEUP, WL_INTERRUPT | WL_EXIT_ON_PM_DEATH, 0,
- wait_event_info);
- ClearInterrupt(INTERRUPT_GENERAL_WAKEUP);
- CHECK_FOR_INTERRUPTS();
-}
-
-/*
- * ProcSendSignal - send the interrupt of a backend identified by ProcNumber
- */
-void
-ProcSendSignal(ProcNumber procNumber)
-{
- if (procNumber < 0 || procNumber >= ProcGlobal->allProcCount)
- elog(ERROR, "procNumber out of range");
-
- SendInterrupt(INTERRUPT_GENERAL_WAKEUP, procNumber);
-}
-
/*
* BecomeLockGroupLeader - designate process as lock group leader
*
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index d0ed28315a..1ef39d8754 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -510,9 +510,6 @@ extern void CheckDeadLockAlert(void);
extern bool IsWaitingForLock(void);
extern void LockErrorCleanup(void);
-extern void ProcWaitForSignal(uint32 wait_event_info);
-extern void ProcSendSignal(ProcNumber procNumber);
-
extern PGPROC *AuxiliaryPidGetProc(int pid);
extern void BecomeLockGroupLeader(void);
--
2.39.2