Coverage Report

Created: 2025-06-15 06:31

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