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-2026, 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 2790619 : PostmasterIsAlive(void)
101 : {
102 2790619 : if (likely(!postmaster_possibly_dead))
103 2790046 : return true;
104 573 : return PostmasterIsAliveInternal();
105 : }
106 : #else
107 : #define PostmasterIsAlive() PostmasterIsAliveInternal()
108 : #endif
109 :
110 : #endif /* PMSIGNAL_H */
|