mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-27 00:27:19 +02:00
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
62 lines
1.7 KiB
C
62 lines
1.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* pqsignal.c
|
|
* reliable BSD-style signal(2) routine stolen from RWW who stole it
|
|
* from Stevens...
|
|
*
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/port/pqsignal.c
|
|
*
|
|
* We now assume that all Unix-oid systems have POSIX sigaction(2)
|
|
* with support for restartable signals (SA_RESTART). We used to also
|
|
* support BSD-style signal(2), but there really shouldn't be anything
|
|
* out there anymore that doesn't have the POSIX API.
|
|
*
|
|
* Windows, of course, is resolutely in a class by itself. In the backend,
|
|
* we don't use this file at all; src/backend/port/win32/signal.c provides
|
|
* pqsignal() for the backend environment. Frontend programs can use
|
|
* this version of pqsignal() if they wish, but beware that this does
|
|
* not provide restartable signals on Windows.
|
|
*
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "c.h"
|
|
|
|
#include <signal.h>
|
|
|
|
#if !defined(WIN32) || defined(FRONTEND)
|
|
|
|
/*
|
|
* Set up a signal handler, with SA_RESTART, for signal "signo"
|
|
*
|
|
* Returns the previous handler.
|
|
*/
|
|
pqsigfunc
|
|
pqsignal(int signo, pqsigfunc func)
|
|
{
|
|
#ifndef WIN32
|
|
struct sigaction act,
|
|
oact;
|
|
|
|
act.sa_handler = func;
|
|
sigemptyset(&act.sa_mask);
|
|
act.sa_flags = SA_RESTART;
|
|
#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;
|
|
#else /* WIN32 */
|
|
return signal(signo, func);
|
|
#endif
|
|
}
|
|
|
|
#endif /* !defined(WIN32) || defined(FRONTEND) */
|