#define PM_CHILD_UNUSED 0/* these values must fit in sig_atomic_t */ #define PM_CHILD_ASSIGNED 1 #define PM_CHILD_ACTIVE 2 #define PM_CHILD_WALSENDER 3
/* "typedef struct PMSignalData PMSignalData" appears in pmsignal.h */ struct PMSignalData
{ /* per-reason flags for signaling the postmaster */
sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]; /* global flags for signals from postmaster to children */
QuitSignalReason sigquit_reason; /* why SIGQUIT was sent */ /* per-child-process flags */ int num_child_flags; /* # of entries in PMChildFlags[] */
sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER];
};
/* PMSignalState pointer is valid in both postmaster and child processes */
NON_EXEC_STATIC volatile PMSignalData *PMSignalState = NULL;
if (!found)
{ /* initialize all flags to zeroes */
MemSet(unvolatize(PMSignalData *, PMSignalState), 0, PMSignalShmemSize());
num_child_flags = MaxLivePostmasterChildren();
PMSignalState->num_child_flags = num_child_flags;
}
}
/* *SendPostmasterSignal-signalthepostmasterfromachildprocess
*/ void
SendPostmasterSignal(PMSignalReason reason)
{ /* If called in a standalone backend, do nothing */ if (!IsUnderPostmaster) return; /* Atomically set the proper flag */
PMSignalState->PMSignalFlags[reason] = true; /* Send signal to postmaster */
kill(PostmasterPid, SIGUSR1);
}
/* *CheckPostmasterSignal-checktoseeifaparticularreasonhasbeen *signaled,andclearthesignalflag.Shouldbecalledbypostmaster *afterreceivingSIGUSR1.
*/ bool
CheckPostmasterSignal(PMSignalReason reason)
{ /* Careful here --- don't clear flag if we haven't seen it set */ if (PMSignalState->PMSignalFlags[reason])
{
PMSignalState->PMSignalFlags[reason] = false; returntrue;
} returnfalse;
}
/* *GetQuitSignalReason-obtainthereasonforasystemshutdown. *CalledbychildprocesseswhentheyreceiveSIGQUIT. *Ifthepostmasterhasn'tactuallysentSIGQUIT,willreturnPMQUIT_NOT_SENT.
*/
QuitSignalReason
GetQuitSignalReason(void)
{ /* This is called in signal handlers, so be extra paranoid. */ if (!IsUnderPostmaster || PMSignalState == NULL) return PMQUIT_NOT_SENT; return PMSignalState->sigquit_reason;
}
if (rc < 0)
elog(FATAL, "read on postmaster death monitoring pipe failed: %m"); elseif (rc > 0)
elog(FATAL, "unexpected data in postmaster death monitoring pipe");
/* *PostmasterDeathSignalInit-requestsignalonpostmasterdeathifpossible
*/ void
PostmasterDeathSignalInit(void)
{ #ifdef USE_POSTMASTER_DEATH_SIGNAL int signum = POSTMASTER_DEATH_SIGNAL;
/* Register our signal handler. */
pqsignal(signum, postmaster_death_handler);
/* Request a signal on parent exit. */ #ifdefined(PR_SET_PDEATHSIG) if (prctl(PR_SET_PDEATHSIG, signum) < 0)
elog(ERROR, "could not request parent death signal: %m"); #elifdefined(PROC_PDEATHSIG_CTL) if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum) < 0)
elog(ERROR, "could not request parent death signal: %m"); #else #error"USE_POSTMASTER_DEATH_SIGNAL set, but there is no mechanism to request the signal" #endif
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.