PostgreSQL Source Code  git master
interrupt.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * interrupt.c
4  * Interrupt handling routines.
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  * src/backend/postmaster/interrupt.c
11  *
12  *-------------------------------------------------------------------------
13  */
14 
15 #include "postgres.h"
16 
17 #include <unistd.h>
18 
19 #include "miscadmin.h"
20 #include "postmaster/interrupt.h"
21 #include "storage/ipc.h"
22 #include "storage/latch.h"
23 #include "storage/procsignal.h"
24 #include "utils/guc.h"
25 #include "utils/memutils.h"
26 
27 volatile sig_atomic_t ConfigReloadPending = false;
28 volatile sig_atomic_t ShutdownRequestPending = false;
29 
30 /*
31  * Simple interrupt handler for main loops of background processes.
32  */
33 void
35 {
38 
40  {
41  ConfigReloadPending = false;
43  }
44 
46  proc_exit(0);
47 
48  /* Perform logging of memory contexts of this process */
51 }
52 
53 /*
54  * Simple signal handler for triggering a configuration reload.
55  *
56  * Normally, this handler would be used for SIGHUP. The idea is that code
57  * which uses it would arrange to check the ConfigReloadPending flag at
58  * convenient places inside main loops, or else call HandleMainLoopInterrupts.
59  */
60 void
62 {
63  ConfigReloadPending = true;
65 }
66 
67 /*
68  * Simple signal handler for exiting quickly as if due to a crash.
69  *
70  * Normally, this would be used for handling SIGQUIT.
71  */
72 void
74 {
75  /*
76  * We DO NOT want to run proc_exit() or atexit() callbacks -- we're here
77  * because shared memory may be corrupted, so we don't want to try to
78  * clean up our transaction. Just nail the windows shut and get out of
79  * town. The callbacks wouldn't be safe to run from a signal handler,
80  * anyway.
81  *
82  * Note we do _exit(2) not _exit(0). This is to force the postmaster into
83  * a system reset cycle if someone sends a manual SIGQUIT to a random
84  * backend. This is necessary precisely because we don't clean up our
85  * shared memory state. (The "dead man switch" mechanism in pmsignal.c
86  * should ensure the postmaster sees this as a crash, too, but no harm in
87  * being doubly sure.)
88  */
89  _exit(2);
90 }
91 
92 /*
93  * Simple signal handler for triggering a long-running background process to
94  * shut down and exit.
95  *
96  * Typically, this handler would be used for SIGTERM, but some processes use
97  * other signals. In particular, the checkpointer exits on SIGUSR2, and the WAL
98  * writer and the logical replication parallel apply worker exits on either
99  * SIGINT or SIGTERM.
100  *
101  * ShutdownRequestPending should be checked at a convenient place within the
102  * main loop, or else the main loop should call HandleMainLoopInterrupts.
103  */
104 void
106 {
107  ShutdownRequestPending = true;
108  SetLatch(MyLatch);
109 }
#define SIGNAL_ARGS
Definition: c.h:1348
volatile sig_atomic_t LogMemoryContextPending
Definition: globals.c:40
volatile sig_atomic_t ProcSignalBarrierPending
Definition: globals.c:39
struct Latch * MyLatch
Definition: globals.c:62
@ PGC_SIGHUP
Definition: guc.h:71
void ProcessConfigFile(GucContext context)
void SignalHandlerForShutdownRequest(SIGNAL_ARGS)
Definition: interrupt.c:105
volatile sig_atomic_t ShutdownRequestPending
Definition: interrupt.c:28
volatile sig_atomic_t ConfigReloadPending
Definition: interrupt.c:27
void SignalHandlerForConfigReload(SIGNAL_ARGS)
Definition: interrupt.c:61
void SignalHandlerForCrashExit(SIGNAL_ARGS)
Definition: interrupt.c:73
void HandleMainLoopInterrupts(void)
Definition: interrupt.c:34
void proc_exit(int code)
Definition: ipc.c:104
void SetLatch(Latch *latch)
Definition: latch.c:632
void ProcessLogMemoryContextInterrupt(void)
Definition: mcxt.c:1289
void ProcessProcSignalBarrier(void)
Definition: procsignal.c:496