20 #ifdef HAVE_SYS_PRCTL_H
21 #include <sys/prctl.h>
65 #define PM_CHILD_UNUSED 0
66 #define PM_CHILD_ASSIGNED 1
67 #define PM_CHILD_ACTIVE 2
68 #define PM_CHILD_WALSENDER 3
97 #ifdef USE_POSTMASTER_DEATH_SIGNAL
98 volatile sig_atomic_t postmaster_possibly_dead =
false;
103 postmaster_possibly_dead =
true;
115 #define POSTMASTER_DEATH_SIGNAL SIGINFO
116 #elif defined(SIGPWR)
117 #define POSTMASTER_DEATH_SIGNAL SIGPWR
119 #error "cannot find a signal to use for postmaster death"
135 sizeof(sig_atomic_t)));
272 elog(
FATAL,
"no free slots in PMChildFlags array");
327 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
345 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
360 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
378 #ifdef USE_POSTMASTER_DEATH_SIGNAL
384 postmaster_possibly_dead =
false;
407 #ifdef USE_POSTMASTER_DEATH_SIGNAL
408 postmaster_possibly_dead =
true;
412 elog(
FATAL,
"read on postmaster death monitoring pipe failed: %m");
414 elog(
FATAL,
"unexpected data in postmaster death monitoring pipe");
421 if (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT)
425 #ifdef USE_POSTMASTER_DEATH_SIGNAL
426 postmaster_possibly_dead =
true;
439 #ifdef USE_POSTMASTER_DEATH_SIGNAL
440 int signum = POSTMASTER_DEATH_SIGNAL;
443 pqsignal(signum, postmaster_death_handler);
446 #if defined(PR_SET_PDEATHSIG)
447 if (prctl(PR_SET_PDEATHSIG, signum) < 0)
448 elog(
ERROR,
"could not request parent death signal: %m");
449 #elif defined(PROC_PDEATHSIG_CTL)
450 if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum) < 0)
451 elog(
ERROR,
"could not request parent death signal: %m");
453 #error "USE_POSTMASTER_DEATH_SIGNAL set, but there is no mechanism to request the signal"
460 postmaster_possibly_dead =
true;
#define unvolatize(underlying_type, expr)
#define FLEXIBLE_ARRAY_MEMBER
#define MemSet(start, val, len)
elog(ERROR, "%s: %s", p2, msg)
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * MemoryContextAllocZero(MemoryContext context, Size size)
MemoryContext PostmasterContext
static bool * PMChildInUse
#define PM_CHILD_WALSENDER
static int num_child_inuse
static int next_child_inuse
Size PMSignalShmemSize(void)
bool ReleasePostmasterChildSlot(int slot)
void MarkPostmasterChildActive(void)
bool CheckPostmasterSignal(PMSignalReason reason)
bool PostmasterIsAliveInternal(void)
QuitSignalReason GetQuitSignalReason(void)
void MarkPostmasterChildInactive(void)
void SendPostmasterSignal(PMSignalReason reason)
void SetQuitSignalReason(QuitSignalReason reason)
NON_EXEC_STATIC volatile PMSignalData * PMSignalState
void MarkPostmasterChildWalSender(void)
bool IsPostmasterChildWalSender(int slot)
void PostmasterDeathSignalInit(void)
int AssignPostmasterChildSlot(void)
void PMSignalShmemInit(void)
#define PM_CHILD_ASSIGNED
pqsigfunc pqsignal(int signo, pqsigfunc func)
int postmaster_alive_fds[2]
int MaxLivePostmasterChildren(void)
#define POSTMASTER_FD_WATCH
Size add_size(Size s1, Size s2)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
Size mul_size(Size s1, Size s2)
sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]
sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]
QuitSignalReason sigquit_reason