1 /*------------------------------------------------------------------------- 2 * 3 * pmsignal.h 4 * routines for signaling the postmaster from its child processes 5 * 6 * 7 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group 8 * Portions Copyright (c) 1994, Regents of the University of California 9 * 10 * src/include/storage/pmsignal.h 11 * 12 *------------------------------------------------------------------------- 13 */ 14 #ifndef PMSIGNAL_H 15 #define PMSIGNAL_H 16 17 #include <signal.h> 18 19 #ifdef HAVE_SYS_PRCTL_H 20 #include "sys/prctl.h" 21 #endif 22 23 #ifdef HAVE_SYS_PROCCTL_H 24 #include "sys/procctl.h" 25 #endif 26 27 /* 28 * Reasons for signaling the postmaster. We can cope with simultaneous 29 * signals for different reasons. If the same reason is signaled multiple 30 * times in quick succession, however, the postmaster is likely to observe 31 * only one notification of it. This is okay for the present uses. 32 */ 33 typedef enum 34 { 35 PMSIGNAL_RECOVERY_STARTED, /* recovery has started */ 36 PMSIGNAL_BEGIN_HOT_STANDBY, /* begin Hot Standby */ 37 PMSIGNAL_WAKEN_ARCHIVER, /* send a NOTIFY signal to xlog archiver */ 38 PMSIGNAL_ROTATE_LOGFILE, /* send SIGUSR1 to syslogger to rotate logfile */ 39 PMSIGNAL_START_AUTOVAC_LAUNCHER, /* start an autovacuum launcher */ 40 PMSIGNAL_START_AUTOVAC_WORKER, /* start an autovacuum worker */ 41 PMSIGNAL_BACKGROUND_WORKER_CHANGE, /* background worker state change */ 42 PMSIGNAL_START_WALRECEIVER, /* start a walreceiver */ 43 PMSIGNAL_ADVANCE_STATE_MACHINE, /* advance postmaster's state machine */ 44 45 NUM_PMSIGNALS /* Must be last value of enum! */ 46 } PMSignalReason; 47 48 /* PMSignalData is an opaque struct, details known only within pmsignal.c */ 49 typedef struct PMSignalData PMSignalData; 50 51 /* 52 * prototypes for functions in pmsignal.c 53 */ 54 extern Size PMSignalShmemSize(void); 55 extern void PMSignalShmemInit(void); 56 extern void SendPostmasterSignal(PMSignalReason reason); 57 extern bool CheckPostmasterSignal(PMSignalReason reason); 58 extern int AssignPostmasterChildSlot(void); 59 extern bool ReleasePostmasterChildSlot(int slot); 60 extern bool IsPostmasterChildWalSender(int slot); 61 extern void MarkPostmasterChildActive(void); 62 extern void MarkPostmasterChildInactive(void); 63 extern void MarkPostmasterChildWalSender(void); 64 extern bool PostmasterIsAliveInternal(void); 65 extern void PostmasterDeathSignalInit(void); 66 67 68 /* 69 * Do we have a way to ask for a signal on parent death? 70 * 71 * If we do, pmsignal.c will set up a signal handler, that sets a flag when 72 * the parent dies. Checking the flag first makes PostmasterIsAlive() a lot 73 * cheaper in usual case that the postmaster is alive. 74 */ 75 #if (defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_PDEATHSIG)) || \ 76 (defined(HAVE_SYS_PROCCTL_H) && defined(PROC_PDEATHSIG_CTL)) 77 #define USE_POSTMASTER_DEATH_SIGNAL 78 #endif 79 80 #ifdef USE_POSTMASTER_DEATH_SIGNAL 81 extern volatile sig_atomic_t postmaster_possibly_dead; 82 83 static inline bool 84 PostmasterIsAlive(void) 85 { 86 if (likely(!postmaster_possibly_dead)) 87 return true; 88 return PostmasterIsAliveInternal(); 89 } 90 #else 91 #define PostmasterIsAlive() PostmasterIsAliveInternal() 92 #endif 93 94 #endif /* PMSIGNAL_H */ 95