Line data Source code
1 : /*------------------------------------------------------------------------- 2 : * 3 : * pmsignal.h 4 : * routines for signaling between the postmaster and its child processes 5 : * 6 : * 7 : * Portions Copyright (c) 1996-2025, 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_RECOVERY_CONSISTENT, /* recovery has reached consistent state */ 37 : PMSIGNAL_BEGIN_HOT_STANDBY, /* begin Hot Standby */ 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 : PMSIGNAL_XLOG_IS_SHUTDOWN, /* ShutdownXLOG() completed */ 45 : } PMSignalReason; 46 : 47 : #define NUM_PMSIGNALS (PMSIGNAL_XLOG_IS_SHUTDOWN+1) 48 : 49 : /* 50 : * Reasons why the postmaster would send SIGQUIT to its children. 51 : */ 52 : typedef enum 53 : { 54 : PMQUIT_NOT_SENT = 0, /* postmaster hasn't sent SIGQUIT */ 55 : PMQUIT_FOR_CRASH, /* some other backend bought the farm */ 56 : PMQUIT_FOR_STOP, /* immediate stop was commanded */ 57 : } QuitSignalReason; 58 : 59 : /* PMSignalData is an opaque struct, details known only within pmsignal.c */ 60 : typedef struct PMSignalData PMSignalData; 61 : 62 : #ifdef EXEC_BACKEND 63 : extern PGDLLIMPORT volatile PMSignalData *PMSignalState; 64 : #endif 65 : 66 : /* 67 : * prototypes for functions in pmsignal.c 68 : */ 69 : extern Size PMSignalShmemSize(void); 70 : extern void PMSignalShmemInit(void); 71 : extern void SendPostmasterSignal(PMSignalReason reason); 72 : extern bool CheckPostmasterSignal(PMSignalReason reason); 73 : extern void SetQuitSignalReason(QuitSignalReason reason); 74 : extern QuitSignalReason GetQuitSignalReason(void); 75 : extern void MarkPostmasterChildSlotAssigned(int slot); 76 : extern bool MarkPostmasterChildSlotUnassigned(int slot); 77 : extern bool IsPostmasterChildWalSender(int slot); 78 : extern void RegisterPostmasterChildActive(void); 79 : extern void MarkPostmasterChildWalSender(void); 80 : extern bool PostmasterIsAliveInternal(void); 81 : extern void PostmasterDeathSignalInit(void); 82 : 83 : 84 : /* 85 : * Do we have a way to ask for a signal on parent death? 86 : * 87 : * If we do, pmsignal.c will set up a signal handler, that sets a flag when 88 : * the parent dies. Checking the flag first makes PostmasterIsAlive() a lot 89 : * cheaper in usual case that the postmaster is alive. 90 : */ 91 : #if (defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_PDEATHSIG)) || \ 92 : (defined(HAVE_SYS_PROCCTL_H) && defined(PROC_PDEATHSIG_CTL)) 93 : #define USE_POSTMASTER_DEATH_SIGNAL 94 : #endif 95 : 96 : #ifdef USE_POSTMASTER_DEATH_SIGNAL 97 : extern PGDLLIMPORT volatile sig_atomic_t postmaster_possibly_dead; 98 : 99 : static inline bool 100 5404646 : PostmasterIsAlive(void) 101 : { 102 5404646 : if (likely(!postmaster_possibly_dead)) 103 5404030 : return true; 104 616 : return PostmasterIsAliveInternal(); 105 : } 106 : #else 107 : #define PostmasterIsAlive() PostmasterIsAliveInternal() 108 : #endif 109 : 110 : #endif /* PMSIGNAL_H */