aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2022-07-16 16:07:45 +1200
committerThomas Munro <tmunro@postgresql.org>2022-07-16 17:03:38 +1200
commitc94ae9d827a360d74da6a304692d34a4dc8b6445 (patch)
tree491e7d2ab3499968d9d32978d23bdc7701124859
parent3b8d23a3e14f05890f1f306902cd4b992beeee71 (diff)
downloadpostgresql-c94ae9d827a360d74da6a304692d34a4dc8b6445.tar.gz
postgresql-c94ae9d827a360d74da6a304692d34a4dc8b6445.zip
Emulate sigprocmask(), not sigsetmask(), on Windows.
Since commit a65e0864, we've required Unix systems to have sigprocmask(). As noted in that commit's message, we were still emulating the historical pre-standard sigsetmask() function in our Windows support code. Emulate standard sigprocmask() instead, for consistency. The PG_SETMASK() abstraction is now redundant and all calls could in theory be replaced by plain sigprocmask() calls, but that isn't done by this commit. Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/3153247.1657834482%40sss.pgh.pa.us
-rw-r--r--src/backend/port/win32/signal.c29
-rw-r--r--src/include/libpq/pqsignal.h11
2 files changed, 30 insertions, 10 deletions
diff --git a/src/backend/port/win32/signal.c b/src/backend/port/win32/signal.c
index b71164d8dbd..53b93a50b26 100644
--- a/src/backend/port/win32/signal.c
+++ b/src/backend/port/win32/signal.c
@@ -112,7 +112,7 @@ pgwin32_signal_initialize(void)
/*
* Dispatch all signals currently queued and not blocked
* Blocked signals are ignored, and will be fired at the time of
- * the pqsigsetmask() call.
+ * the pqsigprocmask() call.
*/
void
pgwin32_dispatch_queued_signals(void)
@@ -154,12 +154,29 @@ pgwin32_dispatch_queued_signals(void)
/* signal masking. Only called on main thread, no sync required */
int
-pqsigsetmask(int mask)
+pqsigprocmask(int how, const sigset_t *set, sigset_t *oset)
{
- int prevmask;
+ if (oset)
+ *oset = pg_signal_mask;
- prevmask = pg_signal_mask;
- pg_signal_mask = mask;
+ if (!set)
+ return 0;
+
+ switch (how)
+ {
+ case SIG_BLOCK:
+ pg_signal_mask |= *set;
+ break;
+ case SIG_UNBLOCK:
+ pg_signal_mask &= ~*set;
+ break;
+ case SIG_SETMASK:
+ pg_signal_mask = *set;
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
/*
* Dispatch any signals queued up right away, in case we have unblocked
@@ -167,7 +184,7 @@ pqsigsetmask(int mask)
*/
pgwin32_dispatch_queued_signals();
- return prevmask;
+ return 0;
}
diff --git a/src/include/libpq/pqsignal.h b/src/include/libpq/pqsignal.h
index 41227a30e24..d17ddb787e7 100644
--- a/src/include/libpq/pqsignal.h
+++ b/src/include/libpq/pqsignal.h
@@ -15,15 +15,18 @@
#include <signal.h>
-#ifndef WIN32
#define PG_SETMASK(mask) sigprocmask(SIG_SETMASK, mask, NULL)
-#else
+
+#ifdef WIN32
/* Emulate POSIX sigset_t APIs on Windows */
typedef int sigset_t;
-extern int pqsigsetmask(int mask);
+extern int pqsigprocmask(int how, const sigset_t *set, sigset_t *oset);
-#define PG_SETMASK(mask) pqsigsetmask(*(mask))
+#define SIG_BLOCK 1
+#define SIG_UNBLOCK 2
+#define SIG_SETMASK 3
+#define sigprocmask(how, set, oset) pqsigprocmask((how), (set), (oset))
#define sigemptyset(set) (*(set) = 0)
#define sigfillset(set) (*(set) = ~0)
#define sigaddset(set, signum) (*(set) |= (sigmask(signum)))