Unmark gen_random_uuid() function leakproof.
[pgsql.git] / src / include / storage / pmsignal.h
blobea554ae895b59f6823e002caf2489f957d86a5d9
1 /*-------------------------------------------------------------------------
3 * pmsignal.h
4 * routines for signaling between the postmaster and its child processes
7 * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * src/include/storage/pmsignal.h
12 *-------------------------------------------------------------------------
14 #ifndef PMSIGNAL_H
15 #define PMSIGNAL_H
17 #include <signal.h>
19 #ifdef HAVE_SYS_PRCTL_H
20 #include "sys/prctl.h"
21 #endif
23 #ifdef HAVE_SYS_PROCCTL_H
24 #include "sys/procctl.h"
25 #endif
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.
33 typedef enum
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 } PMSignalReason;
45 #define NUM_PMSIGNALS (PMSIGNAL_ADVANCE_STATE_MACHINE+1)
48 * Reasons why the postmaster would send SIGQUIT to its children.
50 typedef enum
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 */
55 } QuitSignalReason;
57 /* PMSignalData is an opaque struct, details known only within pmsignal.c */
58 typedef struct PMSignalData PMSignalData;
60 #ifdef EXEC_BACKEND
61 extern PGDLLIMPORT volatile PMSignalData *PMSignalState;
62 #endif
65 * prototypes for functions in pmsignal.c
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);
72 extern QuitSignalReason GetQuitSignalReason(void);
73 extern void MarkPostmasterChildSlotAssigned(int slot);
74 extern bool MarkPostmasterChildSlotUnassigned(int slot);
75 extern bool IsPostmasterChildWalSender(int slot);
76 extern void RegisterPostmasterChildActive(void);
77 extern void MarkPostmasterChildWalSender(void);
78 extern bool PostmasterIsAliveInternal(void);
79 extern void PostmasterDeathSignalInit(void);
83 * Do we have a way to ask for a signal on parent death?
85 * If we do, pmsignal.c will set up a signal handler, that sets a flag when
86 * the parent dies. Checking the flag first makes PostmasterIsAlive() a lot
87 * cheaper in usual case that the postmaster is alive.
89 #if (defined(HAVE_SYS_PRCTL_H) && defined(PR_SET_PDEATHSIG)) || \
90 (defined(HAVE_SYS_PROCCTL_H) && defined(PROC_PDEATHSIG_CTL))
91 #define USE_POSTMASTER_DEATH_SIGNAL
92 #endif
94 #ifdef USE_POSTMASTER_DEATH_SIGNAL
95 extern PGDLLIMPORT volatile sig_atomic_t postmaster_possibly_dead;
97 static inline bool
98 PostmasterIsAlive(void)
100 if (likely(!postmaster_possibly_dead))
101 return true;
102 return PostmasterIsAliveInternal();
104 #else
105 #define PostmasterIsAlive() PostmasterIsAliveInternal()
106 #endif
108 #endif /* PMSIGNAL_H */