Skip to content

Commit 262454b

Browse files
committed
Improve comments about pqsignal().
Explain where pqsignal() came from, what problem it originally solved without assuming the reader is familiar with historical Unixen, why we still need it, what it does for us now, and the key differences in frontend code on Windows. Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi> Discussion: https://postgr.es/m/CA%2BhUKG%2BRst1h3uo%2BXRgdRVnWHBa4mmj5gFbmCzZr73s-Fh_5JA%40mail.gmail.com
1 parent 48b5aa3 commit 262454b

File tree

1 file changed

+26
-8
lines changed

1 file changed

+26
-8
lines changed

src/port/pqsignal.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,34 @@
1111
* IDENTIFICATION
1212
* src/port/pqsignal.c
1313
*
14-
* We now assume that all Unix-oid systems have POSIX sigaction(2)
15-
* with support for restartable signals (SA_RESTART). We used to also
16-
* support BSD-style signal(2), but there really shouldn't be anything
17-
* out there anymore that doesn't have the POSIX API.
14+
* This is the signal() implementation from "Advanced Programming in the UNIX
15+
* Environment", with minor changes. It was originally a replacement needed
16+
* for old SVR4 systems whose signal() behaved as if sa_flags = SA_RESETHAND |
17+
* SA_NODEFER, also known as "unreliable" signals due to races when the
18+
* handler was reset.
19+
*
20+
* By now, all known modern Unix systems have a "reliable" signal() call.
21+
* We still don't want to use it though, because it remains
22+
* implementation-defined by both C99 and POSIX whether the handler is reset
23+
* or signals are blocked when the handler runs, and default restart behavior
24+
* is also unspecified. Therefore we take POSIX's advice and call sigaction()
25+
* so we can provide explicit sa_flags, but wrap it in this more convenient
26+
* traditional interface style. It also provides a place to set any extra
27+
* flags we want everywhere, such as SA_NOCLDSTOP.
1828
*
1929
* Windows, of course, is resolutely in a class by itself. In the backend,
20-
* we don't use this file at all; src/backend/port/win32/signal.c provides
21-
* pqsignal() for the backend environment. Frontend programs can use
22-
* this version of pqsignal() if they wish, but beware that this does
23-
* not provide restartable signals on Windows.
30+
* this relies on pqsigaction() in src/backend/port/win32/signal.c, which
31+
* provides limited emulation of reliable signals.
32+
*
33+
* Frontend programs can use this version of pqsignal() to forward to the
34+
* native Windows signal() call if they wish, but beware that Windows signals
35+
* behave quite differently. Only the 6 signals required by C are supported.
36+
* SIGINT handlers run in another thread instead of interrupting an existing
37+
* thread, and the others don't interrupt system calls either, so SA_RESTART
38+
* is moot. All except SIGFPE have SA_RESETHAND semantics, meaning the
39+
* handler is reset to SIG_DFL each time it runs. The set of things you are
40+
* allowed to do in a handler is also much more restricted than on Unix,
41+
* according to the documentation.
2442
*
2543
* ------------------------------------------------------------------------
2644
*/

0 commit comments

Comments
 (0)