diff options
author | Heikki Linnakangas | 2025-03-05 23:26:12 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2025-03-05 23:26:12 +0000 |
commit | 84e5b2f07a5e8ba983ff0f6e71b063b27f45f346 (patch) | |
tree | 26276e316a859da6a1e3d638f0ebf0b1a1cd0f46 /src/backend/storage/ipc | |
parent | 9f25b9f7392267c5628af09f498086ad9f33ccbd (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.c | 48 |
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; |