1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-19 13:42:17 +03:00

Use an shmem_exit callback to remove backend from PMChildFlags on exit

This seems nicer than having to duplicate the logic between
InitProcess() and ProcKill() for which child processes have a
PMChildFlags slot.

Move the MarkPostmasterChildActive() call earlier in InitProcess(),
out of the section protected by the spinlock.

Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://www.postgresql.org/message-id/a102f15f-eac4-4ff2-af02-f9ff209ec66f@iki.fi
This commit is contained in:
Heikki Linnakangas
2024-10-08 15:06:34 +03:00
parent 85ec945b78
commit 2bbc261ddb
3 changed files with 27 additions and 31 deletions

View File

@@ -24,6 +24,7 @@
#include "miscadmin.h"
#include "postmaster/postmaster.h"
#include "replication/walsender.h"
#include "storage/ipc.h"
#include "storage/pmsignal.h"
#include "storage/shmem.h"
#include "utils/memutils.h"
@@ -121,6 +122,8 @@ postmaster_death_handler(SIGNAL_ARGS)
#endif /* USE_POSTMASTER_DEATH_SIGNAL */
static void MarkPostmasterChildInactive(int code, Datum arg);
/*
* PMSignalShmemSize
* Compute space needed for pmsignal.c's shared memory
@@ -316,11 +319,14 @@ IsPostmasterChildWalSender(int slot)
}
/*
* MarkPostmasterChildActive - mark a postmaster child as about to begin
* RegisterPostmasterChildActive - mark a postmaster child as about to begin
* actively using shared memory. This is called in the child process.
*
* This register an shmem exit hook to mark us as inactive again when the
* process exits normally.
*/
void
MarkPostmasterChildActive(void)
RegisterPostmasterChildActive(void)
{
int slot = MyPMChildSlot;
@@ -328,6 +334,9 @@ MarkPostmasterChildActive(void)
slot--;
Assert(PMSignalState->PMChildFlags[slot] == PM_CHILD_ASSIGNED);
PMSignalState->PMChildFlags[slot] = PM_CHILD_ACTIVE;
/* Arrange to clean up at exit. */
on_shmem_exit(MarkPostmasterChildInactive, 0);
}
/*
@@ -352,8 +361,8 @@ MarkPostmasterChildWalSender(void)
* MarkPostmasterChildInactive - mark a postmaster child as done using
* shared memory. This is called in the child process.
*/
void
MarkPostmasterChildInactive(void)
static void
MarkPostmasterChildInactive(int code, Datum arg)
{
int slot = MyPMChildSlot;