summaryrefslogtreecommitdiff
path: root/src/port/pqsignal.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2019-10-13 15:48:26 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2019-10-13 15:48:26 -0400
commit9abb2bfc046070b22e3be28173a0736da31cab5a (patch)
tree436d534545df7601feb65f98c37221e68982b255 /src/port/pqsignal.c
parentf38291e927fa8c04eb772e6a17a3dd44da2b69e8 (diff)
In the postmaster, rely on the signal infrastructure to block signals.
POSIX sigaction(2) can be told to block a set of signals while a signal handler executes. Make use of that instead of manually blocking and unblocking signals in the postmaster's signal handlers. This should save a few cycles, and it also prevents recursive invocation of signal handlers when many signals arrive in close succession. We have seen buildfarm failures that seem to be due to postmaster stack overflow caused by such recursion (exacerbated by a Linux PPC64 kernel bug). This doesn't change anything about the way that it works on Windows. Somebody might consider adjusting port/win32/signal.c to let it work similarly, but I'm not in a position to do that. For the moment, just apply to HEAD. Possibly we should consider back-patching this, but it'd be good to let it age awhile first. Discussion: https://postgr.es/m/14878.1570820201@sss.pgh.pa.us
Diffstat (limited to 'src/port/pqsignal.c')
-rw-r--r--src/port/pqsignal.c29
1 files changed, 0 insertions, 29 deletions
diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c
index ecb9ca261f5..814d6163996 100644
--- a/src/port/pqsignal.c
+++ b/src/port/pqsignal.c
@@ -58,33 +58,4 @@ pqsignal(int signo, pqsigfunc func)
#endif
}
-/*
- * Set up a signal handler, without SA_RESTART, for signal "signo"
- *
- * Returns the previous handler.
- *
- * On Windows, this would be identical to pqsignal(), so don't bother.
- */
-#ifndef WIN32
-
-pqsigfunc
-pqsignal_no_restart(int signo, pqsigfunc func)
-{
- struct sigaction act,
- oact;
-
- act.sa_handler = func;
- sigemptyset(&act.sa_mask);
- act.sa_flags = 0;
-#ifdef SA_NOCLDSTOP
- if (signo == SIGCHLD)
- act.sa_flags |= SA_NOCLDSTOP;
-#endif
- if (sigaction(signo, &act, &oact) < 0)
- return SIG_ERR;
- return oact.sa_handler;
-}
-
-#endif /* !WIN32 */
-
#endif /* !defined(WIN32) || defined(FRONTEND) */