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 | |