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 */
33typedef 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 */
49typedef struct PMSignalData PMSignalData;
50
51/*
52 * prototypes for functions in pmsignal.c
53 */
54extern Size PMSignalShmemSize(void);
55extern void PMSignalShmemInit(void);
56extern void SendPostmasterSignal(PMSignalReason reason);
57extern bool CheckPostmasterSignal(PMSignalReason reason);
58extern int AssignPostmasterChildSlot(void);
59extern bool ReleasePostmasterChildSlot(int slot);
60extern bool IsPostmasterChildWalSender(int slot);
61extern void MarkPostmasterChildActive(void);
62extern void MarkPostmasterChildInactive(void);
63extern void MarkPostmasterChildWalSender(void);
64extern bool PostmasterIsAliveInternal(void);
65extern 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
81extern volatile sig_atomic_t postmaster_possibly_dead;
82
83static inline bool
84PostmasterIsAlive(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