PostgreSQL Source Code  git master
pmsignal.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * pmsignal.h
4  * routines for signaling between the postmaster and its child processes
5  *
6  *
7  * Portions Copyright (c) 1996-2024, 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_ROTATE_LOGFILE, /* send SIGUSR1 to syslogger to rotate logfile */
38  PMSIGNAL_START_AUTOVAC_LAUNCHER, /* start an autovacuum launcher */
39  PMSIGNAL_START_AUTOVAC_WORKER, /* start an autovacuum worker */
40  PMSIGNAL_BACKGROUND_WORKER_CHANGE, /* background worker state change */
41  PMSIGNAL_START_WALRECEIVER, /* start a walreceiver */
42  PMSIGNAL_ADVANCE_STATE_MACHINE, /* advance postmaster's state machine */
43 
44  NUM_PMSIGNALS /* Must be last value of enum! */
46 
47 /*
48  * Reasons why the postmaster would send SIGQUIT to its children.
49  */
50 typedef enum
51 {
52  PMQUIT_NOT_SENT = 0, /* postmaster hasn't sent SIGQUIT */
53  PMQUIT_FOR_CRASH, /* some other backend bought the farm */
54  PMQUIT_FOR_STOP, /* immediate stop was commanded */
56 
57 /* PMSignalData is an opaque struct, details known only within pmsignal.c */
58 typedef struct PMSignalData PMSignalData;
59 
60 #ifdef EXEC_BACKEND
61 extern volatile PMSignalData *PMSignalState;
62 #endif
63 
64 /*
65  * prototypes for functions in pmsignal.c
66  */
67 extern Size PMSignalShmemSize(void);
68 extern void PMSignalShmemInit(void);
69 extern void SendPostmasterSignal(PMSignalReason reason);
70 extern bool CheckPostmasterSignal(PMSignalReason reason);
71 extern void SetQuitSignalReason(QuitSignalReason reason);
73 extern int AssignPostmasterChildSlot(void);
74 extern bool ReleasePostmasterChildSlot(int slot);
75 extern bool IsPostmasterChildWalSender(int slot);
76 extern void MarkPostmasterChildActive(void);
77 extern void MarkPostmasterChildInactive(void);
78 extern void MarkPostmasterChildWalSender(void);
79 extern bool PostmasterIsAliveInternal(void);
80 extern void PostmasterDeathSignalInit(void);
81 
82 
83 /*
84  * Do we have a way to ask for a signal on parent death?
85  *
86  * If we do, pmsignal.c will set up a signal handler, that sets a flag when
87  * the parent dies. Checking the flag first makes PostmasterIsAlive() a lot
88  * cheaper in usual case that the postmaster is alive.
89  */
90 #if (defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_PDEATHSIG)) || \
91  (defined(HAVE_SYS_PROCCTL_H) && defined(PROC_PDEATHSIG_CTL))
92 #define USE_POSTMASTER_DEATH_SIGNAL
93 #endif
94 
95 #ifdef USE_POSTMASTER_DEATH_SIGNAL
96 extern PGDLLIMPORT volatile sig_atomic_t postmaster_possibly_dead;
97 
98 static inline bool
100 {
101  if (likely(!postmaster_possibly_dead))
102  return true;
103  return PostmasterIsAliveInternal();
104 }
105 #else
106 #define PostmasterIsAlive() PostmasterIsAliveInternal()
107 #endif
108 
109 #endif /* PMSIGNAL_H */
#define PGDLLIMPORT
Definition: c.h:1316
#define likely(x)
Definition: c.h:310
size_t Size
Definition: c.h:605
NON_EXEC_STATIC volatile PMSignalData * PMSignalState
Definition: pmsignal.c:83
#define PostmasterIsAlive()
Definition: pmsignal.h:106
Size PMSignalShmemSize(void)
Definition: pmsignal.c:129
bool ReleasePostmasterChildSlot(int slot)
Definition: pmsignal.c:284
void MarkPostmasterChildActive(void)
Definition: pmsignal.c:323
bool CheckPostmasterSignal(PMSignalReason reason)
Definition: pmsignal.c:198
bool PostmasterIsAliveInternal(void)
Definition: pmsignal.c:376
QuitSignalReason GetQuitSignalReason(void)
Definition: pmsignal.c:229
void MarkPostmasterChildInactive(void)
Definition: pmsignal.c:356
QuitSignalReason
Definition: pmsignal.h:51
@ PMQUIT_FOR_STOP
Definition: pmsignal.h:54
@ PMQUIT_FOR_CRASH
Definition: pmsignal.h:53
@ PMQUIT_NOT_SENT
Definition: pmsignal.h:52
void SendPostmasterSignal(PMSignalReason reason)
Definition: pmsignal.c:181
void SetQuitSignalReason(QuitSignalReason reason)
Definition: pmsignal.c:218
void MarkPostmasterChildWalSender(void)
Definition: pmsignal.c:339
PMSignalReason
Definition: pmsignal.h:34
@ PMSIGNAL_START_AUTOVAC_WORKER
Definition: pmsignal.h:39
@ PMSIGNAL_RECOVERY_STARTED
Definition: pmsignal.h:35
@ PMSIGNAL_START_WALRECEIVER
Definition: pmsignal.h:41
@ PMSIGNAL_START_AUTOVAC_LAUNCHER
Definition: pmsignal.h:38
@ PMSIGNAL_BEGIN_HOT_STANDBY
Definition: pmsignal.h:36
@ NUM_PMSIGNALS
Definition: pmsignal.h:44
@ PMSIGNAL_BACKGROUND_WORKER_CHANGE
Definition: pmsignal.h:40
@ PMSIGNAL_ROTATE_LOGFILE
Definition: pmsignal.h:37
@ PMSIGNAL_ADVANCE_STATE_MACHINE
Definition: pmsignal.h:42
bool IsPostmasterChildWalSender(int slot)
Definition: pmsignal.c:307
void PostmasterDeathSignalInit(void)
Definition: pmsignal.c:437
int AssignPostmasterChildSlot(void)
Definition: pmsignal.c:247
void PMSignalShmemInit(void)
Definition: pmsignal.c:144