20 #ifdef HAVE_SYS_PRCTL_H
21 #include <sys/prctl.h>
64 #define PM_CHILD_UNUSED 0
65 #define PM_CHILD_ASSIGNED 1
66 #define PM_CHILD_ACTIVE 2
67 #define PM_CHILD_WALSENDER 3
87 #ifdef USE_POSTMASTER_DEATH_SIGNAL
88 volatile sig_atomic_t postmaster_possibly_dead =
false;
91 postmaster_death_handler(
int signo)
93 postmaster_possibly_dead =
true;
105 #define POSTMASTER_DEATH_SIGNAL SIGINFO
106 #elif defined(SIGPWR)
107 #define POSTMASTER_DEATH_SIGNAL SIGPWR
109 #error "cannot find a signal to use for postmaster death"
125 sizeof(sig_atomic_t)));
241 elog(
FATAL,
"no free slots in PMChildFlags array");
257 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
277 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
295 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
313 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
328 Assert(slot > 0 && slot <= PMSignalState->num_child_flags);
346 #ifdef USE_POSTMASTER_DEATH_SIGNAL
352 postmaster_possibly_dead =
false;
375 #ifdef USE_POSTMASTER_DEATH_SIGNAL
376 postmaster_possibly_dead =
true;
380 elog(
FATAL,
"read on postmaster death monitoring pipe failed: %m");
382 elog(
FATAL,
"unexpected data in postmaster death monitoring pipe");
389 if (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT)
393 #ifdef USE_POSTMASTER_DEATH_SIGNAL
394 postmaster_possibly_dead =
true;
407 #ifdef USE_POSTMASTER_DEATH_SIGNAL
408 int signum = POSTMASTER_DEATH_SIGNAL;
411 pqsignal(signum, postmaster_death_handler);
414 #if defined(PR_SET_PDEATHSIG)
415 if (prctl(PR_SET_PDEATHSIG, signum) < 0)
416 elog(
ERROR,
"could not request parent death signal: %m");
417 #elif defined(PROC_PDEATHSIG_CTL)
418 if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum) < 0)
419 elog(
ERROR,
"could not request parent death signal: %m");
421 #error "USE_POSTMASTER_DEATH_SIGNAL set, but there is no mechanism to request the signal"
428 postmaster_possibly_dead =
true;
#define offsetof(type, field)
#define unvolatize(underlying_type, expr)
#define FLEXIBLE_ARRAY_MEMBER
#define MemSet(start, val, len)
Assert(fmt[strlen(fmt) - 1] !='\n')
#define PM_CHILD_WALSENDER
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
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)
pqsigfunc pqsignal(int signum, pqsigfunc handler)
sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]
sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]
QuitSignalReason sigquit_reason