mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Switch to a design similar to regular backends, instead of the previous arrangement where signal handlers did non-trivial state management and called fork(). The main changes are: * The postmaster now has its own local latch to wait on. (For now, we don't want other backends setting its latch directly, but that could probably be made to work with more research on robustness.) * The existing signal handlers are cut in two: a handle_pm_XXX() part that just sets pending_pm_XXX flags and the latch, and a process_pm_XXX() part that runs later when the latch is seen. * Signal handlers are now installed with the regular pqsignal() function rather than the special pqsignal_pm() function; historical portability concerns about the effect of SA_RESTART on select() are no longer relevant, and we don't need to block signals anymore. Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CA%2BhUKG%2BZ-HpOj1JsO9eWUP%2Bar7npSVinsC_npxSy%2BjdOMsx%3DGg%40mail.gmail.com
100 lines
2.4 KiB
C
100 lines
2.4 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pqsignal.c
|
|
* Backend signal(2) support (see also src/port/pqsignal.c)
|
|
*
|
|
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/backend/libpq/pqsignal.c
|
|
*
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "libpq/pqsignal.h"
|
|
|
|
|
|
/* Global variables */
|
|
sigset_t UnBlockSig,
|
|
BlockSig,
|
|
StartupBlockSig;
|
|
|
|
|
|
/*
|
|
* Initialize BlockSig, UnBlockSig, and StartupBlockSig.
|
|
*
|
|
* BlockSig is the set of signals to block when we are trying to block
|
|
* signals. This includes all signals we normally expect to get, but NOT
|
|
* signals that should never be turned off.
|
|
*
|
|
* StartupBlockSig is the set of signals to block during startup packet
|
|
* collection; it's essentially BlockSig minus SIGTERM, SIGQUIT, SIGALRM.
|
|
*
|
|
* UnBlockSig is the set of signals to block when we don't want to block
|
|
* signals.
|
|
*/
|
|
void
|
|
pqinitmask(void)
|
|
{
|
|
sigemptyset(&UnBlockSig);
|
|
|
|
/* Note: InitializeLatchSupport() modifies UnBlockSig. */
|
|
|
|
/* First set all signals, then clear some. */
|
|
sigfillset(&BlockSig);
|
|
sigfillset(&StartupBlockSig);
|
|
|
|
/*
|
|
* Unmark those signals that should never be blocked. Some of these signal
|
|
* names don't exist on all platforms. Most do, but might as well ifdef
|
|
* them all for consistency...
|
|
*/
|
|
#ifdef SIGTRAP
|
|
sigdelset(&BlockSig, SIGTRAP);
|
|
sigdelset(&StartupBlockSig, SIGTRAP);
|
|
#endif
|
|
#ifdef SIGABRT
|
|
sigdelset(&BlockSig, SIGABRT);
|
|
sigdelset(&StartupBlockSig, SIGABRT);
|
|
#endif
|
|
#ifdef SIGILL
|
|
sigdelset(&BlockSig, SIGILL);
|
|
sigdelset(&StartupBlockSig, SIGILL);
|
|
#endif
|
|
#ifdef SIGFPE
|
|
sigdelset(&BlockSig, SIGFPE);
|
|
sigdelset(&StartupBlockSig, SIGFPE);
|
|
#endif
|
|
#ifdef SIGSEGV
|
|
sigdelset(&BlockSig, SIGSEGV);
|
|
sigdelset(&StartupBlockSig, SIGSEGV);
|
|
#endif
|
|
#ifdef SIGBUS
|
|
sigdelset(&BlockSig, SIGBUS);
|
|
sigdelset(&StartupBlockSig, SIGBUS);
|
|
#endif
|
|
#ifdef SIGSYS
|
|
sigdelset(&BlockSig, SIGSYS);
|
|
sigdelset(&StartupBlockSig, SIGSYS);
|
|
#endif
|
|
#ifdef SIGCONT
|
|
sigdelset(&BlockSig, SIGCONT);
|
|
sigdelset(&StartupBlockSig, SIGCONT);
|
|
#endif
|
|
|
|
/* Signals unique to startup */
|
|
#ifdef SIGQUIT
|
|
sigdelset(&StartupBlockSig, SIGQUIT);
|
|
#endif
|
|
#ifdef SIGTERM
|
|
sigdelset(&StartupBlockSig, SIGTERM);
|
|
#endif
|
|
#ifdef SIGALRM
|
|
sigdelset(&StartupBlockSig, SIGALRM);
|
|
#endif
|
|
}
|