|
11 | 11 | * IDENTIFICATION
|
12 | 12 | * src/port/pqsignal.c
|
13 | 13 | *
|
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. |
18 | 28 | *
|
19 | 29 | * 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. |
24 | 42 | *
|
25 | 43 | * ------------------------------------------------------------------------
|
26 | 44 | */
|
|
0 commit comments