/src/postgres/src/include/storage/pmsignal.h
Line | Count | Source (jump to first uncovered line) |
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 | | PostmasterIsAlive(void) |
101 | 0 | { |
102 | 0 | if (likely(!postmaster_possibly_dead)) |
103 | 0 | return true; |
104 | 0 | return PostmasterIsAliveInternal(); |
105 | 0 | } Unexecuted instantiation: multixact.c:PostmasterIsAlive Unexecuted instantiation: varsup.c:PostmasterIsAlive Unexecuted instantiation: xlogrecovery.c:PostmasterIsAlive Unexecuted instantiation: vacuum.c:PostmasterIsAlive Unexecuted instantiation: autovacuum.c:PostmasterIsAlive Unexecuted instantiation: bgworker.c:PostmasterIsAlive Unexecuted instantiation: checkpointer.c:PostmasterIsAlive Unexecuted instantiation: pgarch.c:PostmasterIsAlive Unexecuted instantiation: pmchild.c:PostmasterIsAlive Unexecuted instantiation: postmaster.c:PostmasterIsAlive Unexecuted instantiation: startup.c:PostmasterIsAlive Unexecuted instantiation: walreceiverfuncs.c:PostmasterIsAlive Unexecuted instantiation: walsender.c:PostmasterIsAlive Unexecuted instantiation: ipci.c:PostmasterIsAlive Unexecuted instantiation: pmsignal.c:PostmasterIsAlive Unexecuted instantiation: signalfuncs.c:PostmasterIsAlive Unexecuted instantiation: waiteventset.c:PostmasterIsAlive Unexecuted instantiation: proc.c:PostmasterIsAlive Unexecuted instantiation: postgres.c:PostmasterIsAlive Unexecuted instantiation: miscinit.c:PostmasterIsAlive |
106 | | #else |
107 | | #define PostmasterIsAlive() PostmasterIsAliveInternal() |
108 | | #endif |
109 | | |
110 | | #endif /* PMSIGNAL_H */ |