20 #ifdef HAVE_SYS_PRCTL_H 21 #include <sys/prctl.h> 60 #define PM_CHILD_UNUSED 0 61 #define PM_CHILD_ASSIGNED 1 62 #define PM_CHILD_ACTIVE 2 63 #define PM_CHILD_WALSENDER 3 81 #ifdef USE_POSTMASTER_DEATH_SIGNAL 82 volatile sig_atomic_t postmaster_possibly_dead =
false;
85 postmaster_death_handler(
int signo)
87 postmaster_possibly_dead =
true;
99 #define POSTMASTER_DEATH_SIGNAL SIGINFO 100 #elif defined(SIGPWR) 101 #define POSTMASTER_DEATH_SIGNAL SIGPWR 103 #error "cannot find a signal to use for postmaster death" 119 sizeof(sig_atomic_t)));
206 elog(
FATAL,
"no free slots in PMChildFlags array");
311 #ifdef USE_POSTMASTER_DEATH_SIGNAL 317 postmaster_possibly_dead =
false;
340 #ifdef USE_POSTMASTER_DEATH_SIGNAL 341 postmaster_possibly_dead =
true;
345 elog(
FATAL,
"read on postmaster death monitoring pipe failed: %m");
347 elog(
FATAL,
"unexpected data in postmaster death monitoring pipe");
354 if (WaitForSingleObject(PostmasterHandle, 0) == WAIT_TIMEOUT)
358 #ifdef USE_POSTMASTER_DEATH_SIGNAL 359 postmaster_possibly_dead =
true;
372 #ifdef USE_POSTMASTER_DEATH_SIGNAL 373 int signum = POSTMASTER_DEATH_SIGNAL;
376 pqsignal(signum, postmaster_death_handler);
379 #if defined(PR_SET_PDEATHSIG) 380 if (prctl(PR_SET_PDEATHSIG, signum) < 0)
381 elog(
ERROR,
"could not request parent death signal: %m");
382 #elif defined(PROC_PDEATHSIG_CTL) 383 if (procctl(P_PID, 0, PROC_PDEATHSIG_CTL, &signum) < 0)
384 elog(
ERROR,
"could not request parent death signal: %m");
386 #error "USE_POSTMASTER_DEATH_SIGNAL set, but there is no mechanism to request the signal" 393 postmaster_possibly_dead =
true;
Size PMSignalShmemSize(void)
bool CheckPostmasterSignal(PMSignalReason reason)
NON_EXEC_STATIC volatile PMSignalData * PMSignalState
void MarkPostmasterChildWalSender(void)
#define PM_CHILD_ASSIGNED
#define MemSet(start, val, len)
void MarkPostmasterChildInactive(void)
bool ReleasePostmasterChildSlot(int slot)
int AssignPostmasterChildSlot(void)
void * ShmemInitStruct(const char *name, Size size, bool *foundPtr)
void PMSignalShmemInit(void)
int postmaster_alive_fds[2]
sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]
Size mul_size(Size s1, Size s2)
Size add_size(Size s1, Size s2)
bool PostmasterIsAliveInternal(void)
pqsigfunc pqsignal(int signum, pqsigfunc handler)
int MaxLivePostmasterChildren(void)
#define Assert(condition)
#define unvolatize(underlying_type, expr)
void PostmasterDeathSignalInit(void)
void SendPostmasterSignal(PMSignalReason reason)
sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]
bool IsPostmasterChildWalSender(int slot)
#define POSTMASTER_FD_WATCH
#define offsetof(type, field)
#define PM_CHILD_WALSENDER
void MarkPostmasterChildActive(void)