1
0
mirror of https://github.com/postgres/postgres.git synced 2025-09-02 04:21:28 +03:00

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
This commit is contained in:
Thomas Munro
2022-07-16 16:07:45 +12:00
parent 3b8d23a3e1
commit c94ae9d827
2 changed files with 30 additions and 10 deletions

View File

@@ -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;
}