v13-0002-Centralize-resetting-SIGCHLD-handler.patch
text/x-patch
Filename: v13-0002-Centralize-resetting-SIGCHLD-handler.patch
Type: text/x-patch
Part: 1
Message:
Re: Interrupts vs signals
Patch
Format: format-patch
Series: patch v13-0002
Subject: Centralize resetting SIGCHLD handler
| File | + | − |
|---|---|---|
| src/backend/postmaster/autovacuum.c | 0 | 2 |
| src/backend/postmaster/bgworker.c | 0 | 1 |
| src/backend/postmaster/bgwriter.c | 0 | 5 |
| src/backend/postmaster/checkpointer.c | 0 | 5 |
| src/backend/postmaster/pgarch.c | 0 | 3 |
| src/backend/postmaster/startup.c | 0 | 5 |
| src/backend/postmaster/syslogger.c | 0 | 5 |
| src/backend/postmaster/walsummarizer.c | 0 | 5 |
| src/backend/postmaster/walwriter.c | 0 | 5 |
| src/backend/replication/logical/slotsync.c | 0 | 1 |
| src/backend/replication/walreceiver.c | 0 | 3 |
| src/backend/replication/walsender.c | 0 | 3 |
| src/backend/tcop/postgres.c | 0 | 7 |
| src/backend/utils/init/miscinit.c | 14 | 0 |
From 72bbc1428c4da0dbfdbbe9a506917e687acbc448 Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Tue, 16 Jun 2026 22:06:39 +0300
Subject: [PATCH v13 2/9] Centralize resetting SIGCHLD handler
---
src/backend/postmaster/autovacuum.c | 2 --
src/backend/postmaster/bgworker.c | 1 -
src/backend/postmaster/bgwriter.c | 5 -----
src/backend/postmaster/checkpointer.c | 5 -----
src/backend/postmaster/pgarch.c | 3 ---
src/backend/postmaster/startup.c | 5 -----
src/backend/postmaster/syslogger.c | 5 -----
src/backend/postmaster/walsummarizer.c | 5 -----
src/backend/postmaster/walwriter.c | 5 -----
src/backend/replication/logical/slotsync.c | 1 -
src/backend/replication/walreceiver.c | 3 ---
src/backend/replication/walsender.c | 3 ---
src/backend/tcop/postgres.c | 7 -------
src/backend/utils/init/miscinit.c | 14 ++++++++++++++
14 files changed, 14 insertions(+), 50 deletions(-)
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index 777acaa7c84..31cad5df015 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -447,7 +447,6 @@ AutoVacLauncherMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, avl_sigusr2_handler);
pqsignal(SIGFPE, FloatExceptionHandler);
- pqsignal(SIGCHLD, PG_SIG_DFL);
/*
* Create a per-backend PGPROC struct in shared memory. We must do this
@@ -1454,7 +1453,6 @@ AutoVacWorkerMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, PG_SIG_IGN);
pqsignal(SIGFPE, FloatExceptionHandler);
- pqsignal(SIGCHLD, PG_SIG_DFL);
/*
* Create a per-backend PGPROC struct in shared memory. We must do this
diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c
index 2e4acad4f00..2f51814c93d 100644
--- a/src/backend/postmaster/bgworker.c
+++ b/src/backend/postmaster/bgworker.c
@@ -797,7 +797,6 @@ BackgroundWorkerMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGPIPE, PG_SIG_IGN);
pqsignal(SIGUSR2, PG_SIG_IGN);
- pqsignal(SIGCHLD, PG_SIG_DFL);
/*
* If an exception is encountered, processing resumes here.
diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c
index d364382303a..d6121f2b4fe 100644
--- a/src/backend/postmaster/bgwriter.c
+++ b/src/backend/postmaster/bgwriter.c
@@ -109,11 +109,6 @@ BackgroundWriterMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, PG_SIG_IGN);
- /*
- * Reset some signals that are accepted by postmaster but not here
- */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/*
* We just started, assume there has been either a shutdown or
* end-of-recovery snapshot.
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index a09d4097d51..4b051eb3128 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -231,11 +231,6 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, SignalHandlerForShutdownRequest);
- /*
- * Reset some signals that are accepted by postmaster but not here
- */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/*
* Initialize so that first time-driven event happens at the correct time.
*/
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c
index 0f207ac0356..a3fd4f83201 100644
--- a/src/backend/postmaster/pgarch.c
+++ b/src/backend/postmaster/pgarch.c
@@ -237,9 +237,6 @@ PgArchiverMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, pgarch_waken_stop);
- /* Reset some signals that are accepted by postmaster but not here */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/* Unblock signals (they were blocked when the postmaster forked us) */
sigprocmask(SIG_SETMASK, &UnBlockSig, NULL);
diff --git a/src/backend/postmaster/startup.c b/src/backend/postmaster/startup.c
index d91b7caac01..63624e8caa1 100644
--- a/src/backend/postmaster/startup.c
+++ b/src/backend/postmaster/startup.c
@@ -234,11 +234,6 @@ StartupProcessMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, StartupProcTriggerHandler);
- /*
- * Reset some signals that are accepted by postmaster but not here
- */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/*
* Register timeouts needed for standby mode
*/
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
index 7645c495a81..b399adcce75 100644
--- a/src/backend/postmaster/syslogger.c
+++ b/src/backend/postmaster/syslogger.c
@@ -303,11 +303,6 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, sigUsr1Handler); /* request log rotation */
pqsignal(SIGUSR2, PG_SIG_IGN);
- /*
- * Reset some signals that are accepted by postmaster but not here
- */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
sigprocmask(SIG_SETMASK, &UnBlockSig, NULL);
#ifdef WIN32
diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c
index 4f12eaf2c85..89301815dc3 100644
--- a/src/backend/postmaster/walsummarizer.c
+++ b/src/backend/postmaster/walsummarizer.c
@@ -264,11 +264,6 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len)
ALLOCSET_DEFAULT_SIZES);
MemoryContextSwitchTo(context);
- /*
- * Reset some signals that are accepted by postmaster but not here
- */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/*
* If an exception is encountered, processing resumes here.
*/
diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c
index 68dd5047c20..3493be8e630 100644
--- a/src/backend/postmaster/walwriter.c
+++ b/src/backend/postmaster/walwriter.c
@@ -109,11 +109,6 @@ WalWriterMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, PG_SIG_IGN); /* not used */
- /*
- * Reset some signals that are accepted by postmaster but not here
- */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/*
* Create a memory context that we will do all our work in. We do this so
* that we can reset the context during error recovery and thereby avoid
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 05637344363..7d2999d77fd 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -1632,7 +1632,6 @@ ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, PG_SIG_IGN);
pqsignal(SIGPIPE, PG_SIG_IGN);
- pqsignal(SIGCHLD, PG_SIG_DFL);
check_and_set_sync_info(MyProcPid);
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 05e2f690fa7..4319cb6fd43 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -256,9 +256,6 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, PG_SIG_IGN);
- /* Reset some signals that are accepted by postmaster but not here */
- pqsignal(SIGCHLD, PG_SIG_DFL);
-
/* Load the libpq-specific functions */
load_file("libpqwalreceiver", false);
if (WalReceiverFunctions == NULL)
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index c931d9b4fa8..795393b0be0 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -3977,9 +3977,6 @@ WalSndSignals(void)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, WalSndLastCycleHandler); /* request a last cycle and
* shutdown */
-
- /* Reset some signals that are accepted by postmaster but not here */
- pqsignal(SIGCHLD, PG_SIG_DFL);
}
/* Register shared-memory space needed by walsender */
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index dbef734a93f..1f2fc3cce9b 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -4332,13 +4332,6 @@ PostgresMain(const char *dbname, const char *username)
pqsignal(SIGUSR1, procsignal_sigusr1_handler);
pqsignal(SIGUSR2, PG_SIG_IGN);
pqsignal(SIGFPE, FloatExceptionHandler);
-
- /*
- * Reset some signals that are accepted by postmaster but not by
- * backend
- */
- pqsignal(SIGCHLD, PG_SIG_DFL); /* system() requires this on some
- * platforms */
}
/* Early initialization */
diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c
index 7ffc808073a..5343d4219ae 100644
--- a/src/backend/utils/init/miscinit.c
+++ b/src/backend/utils/init/miscinit.c
@@ -143,6 +143,15 @@ InitPostmasterChild(void)
elog(FATAL, "setsid() failed: %m");
#endif
+ /*
+ * Reset signals that are used by postmaster but not by child processes.
+ *
+ * Currently just SIGCHLD. The handlers for other signals are overridden
+ * later, depending on the child process type.
+ */
+ pqsignal(SIGCHLD, PG_SIG_DFL); /* system() requires this to be SIG_DFL
+ * rather than SIG_IGN on some platforms */
+
/*
* Every postmaster child process is expected to respond promptly to
* SIGQUIT at all times. Therefore we centrally remove SIGQUIT from
@@ -155,6 +164,11 @@ InitPostmasterChild(void)
sigdelset(&BlockSig, SIGQUIT);
sigprocmask(SIG_SETMASK, &BlockSig, NULL);
+ /*
+ * It is up to the *Main() function to set signal handlers appropriate for
+ * the child process and unblock the rest of the signals.
+ */
+
/* Request a signal if the postmaster dies, if possible. */
PostmasterDeathSignalInit();
--
2.47.3