summaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc
diff options
context:
space:
mode:
authorHeikki Linnakangas2025-03-05 23:26:12 +0000
committerHeikki Linnakangas2025-03-05 23:26:12 +0000
commit84e5b2f07a5e8ba983ff0f6e71b063b27f45f346 (patch)
tree26276e316a859da6a1e3d638f0ebf0b1a1cd0f46 /src/backend/storage/ipc
parent9f25b9f7392267c5628af09f498086ad9f33ccbd (diff)
Use ModifyWaitEvent to update exit_on_postmaster_death
This is in preparation for splitting WaitEventSet related functions to a separate source file. That will hide the details of WaitEventSet from WaitLatch, so it must use an exposed function instead of modifying WaitEventSet->exit_on_postmaster_death directly. Reviewed-by: Andres Freund <[email protected]> Discussion: https://www.postgresql.org/message-id/[email protected]
Diffstat (limited to 'src/backend/storage/ipc')
-rw-r--r--src/backend/storage/ipc/latch.c48
1 files changed, 32 insertions, 16 deletions
diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c
index cd09a10f3d1..997bcb58ff7 100644
--- a/src/backend/storage/ipc/latch.c
+++ b/src/backend/storage/ipc/latch.c
@@ -154,8 +154,9 @@ struct WaitEventSet
/* A common WaitEventSet used to implement WaitLatch() */
static WaitEventSet *LatchWaitSet;
-/* The position of the latch in LatchWaitSet. */
+/* The positions of the latch and PM death events in LatchWaitSet */
#define LatchWaitSetLatchPos 0
+#define LatchWaitSetPostmasterDeathPos 1
#ifndef WIN32
/* Are we currently in WaitLatch? The signal handler would like to know. */
@@ -353,11 +354,18 @@ InitializeLatchWaitSet(void)
LatchWaitSet = CreateWaitEventSet(NULL, 2);
latch_pos = AddWaitEventToSet(LatchWaitSet, WL_LATCH_SET, PGINVALID_SOCKET,
MyLatch, NULL);
- if (IsUnderPostmaster)
- AddWaitEventToSet(LatchWaitSet, WL_EXIT_ON_PM_DEATH,
- PGINVALID_SOCKET, NULL, NULL);
-
Assert(latch_pos == LatchWaitSetLatchPos);
+
+ /*
+ * WaitLatch will modify this to WL_EXIT_ON_PM_DEATH or
+ * WL_POSTMASTER_DEATH on each call.
+ */
+ if (IsUnderPostmaster)
+ {
+ latch_pos = AddWaitEventToSet(LatchWaitSet, WL_EXIT_ON_PM_DEATH,
+ PGINVALID_SOCKET, NULL, NULL);
+ Assert(latch_pos == LatchWaitSetPostmasterDeathPos);
+ }
}
/*
@@ -505,8 +513,9 @@ WaitLatch(Latch *latch, int wakeEvents, long timeout,
if (!(wakeEvents & WL_LATCH_SET))
latch = NULL;
ModifyWaitEvent(LatchWaitSet, LatchWaitSetLatchPos, WL_LATCH_SET, latch);
- LatchWaitSet->exit_on_postmaster_death =
- ((wakeEvents & WL_EXIT_ON_PM_DEATH) != 0);
+ ModifyWaitEvent(LatchWaitSet, LatchWaitSetPostmasterDeathPos,
+ (wakeEvents & (WL_EXIT_ON_PM_DEATH | WL_POSTMASTER_DEATH)),
+ NULL);
if (WaitEventSetWait(LatchWaitSet,
(wakeEvents & WL_TIMEOUT) ? timeout : -1,
@@ -1028,6 +1037,21 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
#endif
/*
+ * Allow switching between WL_POSTMASTER_DEATH and WL_EXIT_ON_PM_DEATH.
+ *
+ * Note that because WL_EXIT_ON_PM_DEATH is mapped to WL_POSTMASTER_DEATH
+ * in AddWaitEventToSet(), this needs to be checked before the fast-path
+ * below that checks if 'events' has changed.
+ */
+ if (event->events == WL_POSTMASTER_DEATH)
+ {
+ if (events != WL_POSTMASTER_DEATH && events != WL_EXIT_ON_PM_DEATH)
+ elog(ERROR, "cannot remove postmaster death event");
+ set->exit_on_postmaster_death = ((events & WL_EXIT_ON_PM_DEATH) != 0);
+ return;
+ }
+
+ /*
* If neither the event mask nor the associated latch changes, return
* early. That's an important optimization for some sockets, where
* ModifyWaitEvent is frequently used to switch from waiting for reads to
@@ -1037,16 +1061,8 @@ ModifyWaitEvent(WaitEventSet *set, int pos, uint32 events, Latch *latch)
(!(event->events & WL_LATCH_SET) || set->latch == latch))
return;
- if (event->events & WL_LATCH_SET &&
- events != event->events)
- {
+ if (event->events & WL_LATCH_SET && events != event->events)
elog(ERROR, "cannot modify latch event");
- }
-
- if (event->events & WL_POSTMASTER_DEATH)
- {
- elog(ERROR, "cannot modify postmaster death event");
- }
/* FIXME: validate event mask */
event->events = events;