0002-fixup-win32.patch
text/x-patch
Filename: 0002-fixup-win32.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch 0002
Subject: fixup-win32
| File | + | − |
|---|---|---|
| src/backend/port/win32/signal.c | 8 | 5 |
| src/include/c.h | 3 | 2 |
| src/include/port.h | 2 | 2 |
| src/port/pqsignal.c | 17 | 7 |
From 6886e3c0f6ca692ca8c50bc1886d7e60b7c9508a Mon Sep 17 00:00:00 2001
From: Jakub Wartak <jakub.wartak@enterprisedb.com>
Date: Mon, 13 Apr 2026 11:24:20 +0200
Subject: [PATCH 2/2] fixup-win32
---
src/backend/port/win32/signal.c | 13 ++++++++-----
src/include/c.h | 5 +++--
src/include/port.h | 4 ++--
src/port/pqsignal.c | 24 +++++++++++++++++-------
4 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/src/backend/port/win32/signal.c b/src/backend/port/win32/signal.c
index 465d69a1f28..d7cdb1cd1fe 100644
--- a/src/backend/port/win32/signal.c
+++ b/src/backend/port/win32/signal.c
@@ -88,7 +88,7 @@ pgwin32_signal_initialize(void)
pg_signal_array[i].sa_handler = SIG_DFL;
pg_signal_array[i].sa_mask = 0;
pg_signal_array[i].sa_flags = 0;
- pg_signal_defaults[i] = SIG_IGN;
+ pg_signal_defaults[i] = PG_SIG_IGN;
}
pg_signal_mask = 0;
pg_signal_queue = 0;
@@ -134,15 +134,18 @@ pgwin32_dispatch_queued_signals(void)
{
/* Execute this signal */
struct sigaction *act = &pg_signal_array[i];
- pqsigfunc sig = act->sa_handler;
+ pqsigfunc sig = (pqsigfunc)(pg_funcptr_t) act->sa_handler;
- if (sig == SIG_DFL)
+ if (sig == PG_SIG_DFL)
sig = pg_signal_defaults[i];
pg_signal_queue &= ~sigmask(i);
- if (sig != SIG_ERR && sig != SIG_IGN && sig != SIG_DFL)
+ if (sig != (pqsigfunc)(pg_funcptr_t)SIG_ERR && sig != PG_SIG_IGN && sig != PG_SIG_DFL)
{
sigset_t block_mask;
sigset_t save_mask;
+ struct pg_signal_info nodata;
+ nodata.pid = 0;
+ nodata.uid = 0;
LeaveCriticalSection(&pg_signal_crit_sec);
@@ -151,7 +154,7 @@ pgwin32_dispatch_queued_signals(void)
block_mask |= sigmask(i);
sigprocmask(SIG_BLOCK, &block_mask, &save_mask);
- sig(i);
+ sig(i, &nodata);
sigprocmask(SIG_SETMASK, &save_mask, NULL);
EnterCriticalSection(&pg_signal_crit_sec);
diff --git a/src/include/c.h b/src/include/c.h
index 77ea73cc707..b43ac8e995d 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1446,10 +1446,11 @@ extern int fdatasync(int fd);
* or a field does not apply to the signal, the value is instead reset to the
* documented default value.
*/
+
typedef struct pg_signal_info
{
- pid_t pid; /* pid of sending process or 0 if unknown */
- uid_t uid; /* uid of sending process or 0 if unknown */
+ uint32_t pid; /* pid of sending process or 0 if unknown */
+ uint32_t uid; /* uid of sending process or 0 if unknown */
} pg_signal_info;
/*
diff --git a/src/include/port.h b/src/include/port.h
index 7db476d7b01..c029878c6be 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -547,8 +547,8 @@ extern int pg_mkdir_p(char *path, int omode);
#define pqsignal pqsignal_be
#endif
-#define PG_SIG_DFL (pqsigfunc) SIG_DFL
-#define PG_SIG_IGN (pqsigfunc) SIG_IGN
+#define PG_SIG_DFL (pqsigfunc) (pg_funcptr_t) SIG_DFL
+#define PG_SIG_IGN (pqsigfunc) (pg_funcptr_t) SIG_IGN
typedef void (*pqsigfunc) (SIGNAL_ARGS);
extern void pqsignal(int signo, pqsigfunc func);
diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c
index 2b39be99f94..dfa5acbb139 100644
--- a/src/port/pqsignal.c
+++ b/src/port/pqsignal.c
@@ -90,10 +90,10 @@ static volatile pqsigfunc pqsignal_handlers[PG_NSIG];
*
* This wrapper also handles restoring the value of errno.
*/
-#ifdef USE_SIGACTION
+#if defined(USE_SIGACTION) && defined(USE_SIGINFO)
static void
wrapper_handler(int postgres_signal_arg, siginfo_t *info, void *context)
-#else
+#else /* no USE_SIGINFO */
static void
wrapper_handler(int postgres_signal_arg)
#endif
@@ -157,6 +157,8 @@ pqsignal(int signo, pqsigfunc func)
{
#ifdef USE_SIGACTION
struct sigaction act;
+#else
+ void (*wrapper_func_ptr)(int);
#endif
bool is_ign = func == PG_SIG_IGN;
bool is_dfl = func == PG_SIG_DFL;
@@ -182,14 +184,12 @@ pqsignal(int signo, pqsigfunc func)
act.sa_handler = SIG_IGN;
else if (is_dfl)
act.sa_handler = SIG_DFL;
-
#ifdef USE_SIGINFO
if (!(is_ign || is_dfl))
{
act.sa_sigaction = wrapper_handler;
act.sa_flags |= SA_SIGINFO;
}
- else
#else
else
act.sa_handler = wrapper_handler;
@@ -201,9 +201,19 @@ pqsignal(int signo, pqsigfunc func)
#endif
if (sigaction(signo, &act, NULL) < 0)
Assert(false); /* probably indicates coding error */
-#else
- /* Forward to Windows native signal system. */
- if (signal(signo, use_wrapper ? wrapper_handler : func) == SIG_ERR)
+#else /* no USE_SIGACTION */
+ /*
+ * Forward to Windows native signal system, we need to send this though
+ * wrapper handler as it it needs to take single argument only.
+ */
+ if(is_ign)
+ wrapper_func_ptr = SIG_IGN;
+ else if (is_dfl)
+ wrapper_func_ptr = SIG_DFL;
+ else
+ wrapper_func_ptr = wrapper_handler;
+
+ if (signal(signo, wrapper_func_ptr) == SIG_ERR)
Assert(false); /* probably indicates coding error */
#endif
}
--
2.43.0