> On Apr 15, 2026, at 04:38, Andrew Dunstan <[email protected]> wrote:
> 
> 
> On 2026-04-14 Tu 6:40 AM, Jakub Wartak wrote:
>> Hi Andres, Andrew, Chao
>> 
>> thanks for putting so much effort into enhancing the the previous 
>> implementation
>> of this code. Earlier I was not aware of potential problems involved.
>> 
>> On Fri, Apr 10, 2026 at 9:41 AM Chao Li <[email protected]> wrote:
>>> 
>>> 
>>>> On Apr 9, 2026, at 18:59, Andrew Dunstan <[email protected]> wrote:
>>>> 
>>>> 
>>>> On 2026-04-08 We 1:01 PM, Andres Freund wrote:
>>>>> Hi,
>>>>> 
>>>>> Attached is a very rough first draft for how I think this needs to look 
>>>>> like.
>>>>> 
>>>>> Basically, SIGNAL_INFO always will pass both the signal number and 
>>>>> extended
>>>>> information along to the signal handler. The extended information is a
>>>>> postgres specific struct. If the platform can't provide the extended
>>>>> information, the values are instead set to some default value indicating 
>>>>> that
>>>>> the information is not known.
>>>>> 
>>>>> With that die() (and also StatementCancelHandler, ...) can just set 
>>>>> whatever
>>>>> globals it wants, without pqsignal.c needing to know about it.
>>>>> 
>>>>> It also allows us to extend the amount of information in the future. E.g. 
>>>>> I'd
>>>>> like to log the reason for a segfault (could e.g. be an OOM kill or an 
>>>>> umapped
>>>>> region) to stderr.
>>>>> 
>>>>> The annoying thing about it is needing to change nearly all the existing
>>>>> references to SIG_IGN/SIG_DFL, to avoid warnings due to mismatched types.
>>>> I agree that's annoying. The only way around it I found was via some 
>>>> casting to/from void* that I suspect you would find a cure worse than the 
>>>> disease.
>>>> I reworked your patch slightly. This version fixes the translatability 
>>>> issue you raised earlier, makes the TAP test from the original commit more 
>>>> robust, and  tries to resolve your XXX issue by moving the assignment of 
>>>> ProcDieSenderPid/Uid inside the "if (!proc_exit_inprogress)" block.
>>>> 
>>> I reviewed this version. Besides the compile warning and uid 0 issues, I 
>>> got a few more comments, so I try to put them all together as below.
>>> 
>> TL;DR; win/mingw is really unhappy with the state of rework patch right now.
>> I've tried to enhance and fix it, and now it's green for default CI run and
>> also for mingw too. Attached 0002-fixup-win32 patch does not incorporate 
>> Chao's
>> all findings so far.
>> 
>> [..]
>>> 2 - uid 0 problem
>>> ```
>>> +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 */
>>> +} pg_signal_info;
>>> ```
>>> 
>>> I think we can mention that “uid” is only meaningful when pid is set.
>> [..]
>>> 5
>>> ```
>>> +       pg_info.uid = 0;
>>> ```
>>> 
>>> If you take comment 2, then when unavailable, we can just don’t assign 
>>> anything to pg_info.uid. Or "(uid_t)-1", maybe.
>>> 
>> 
>> I. I've started from this and I vaguley remembered that I had terrible
>> experience
>> when trying to chose the proper types for those field types, but I couldn't
>> remind myself why, so I've gave a try of the current rework patch and got 
>> this
>> on Windows Server 2022, vs2019, cirrus-ci said:
>> 
>> [08:40:22.848] c:\cirrus\src\include\c.h(1451): error C2061: syntax
>> error: identifier 'pid_t'
>> [08:40:22.848] c:\cirrus\src\include\c.h(1452): error C2061: syntax
>> error: identifier 'uid'
>> [08:40:22.848] c:\cirrus\src\include\c.h(1452): error C2059: syntax error: 
>> ';'
>> [08:40:22.848] c:\cirrus\src\include\c.h(1453): error C2059: syntax error: 
>> '}'
>> 
>> for c.h:
>>   1449  typedef struct pg_signal_info
>>   1450  {
>>   1451          pid_t           pid;                    /* pid of
>> sending process or 0 if unknown */
>>   1452          uid_t           uid;                    /* uid of
>> sending process or 0 if unknown */
>>   1453  } pg_signal_info;
>> 
>> so maybe we should just move that typedef with SIGNAL_ARGS to after
>> "include of port.h" (line ~1471) in that c.h, because only then we'll have
>> access to:
>>     src/include/port/win32_port.h:typedef int pid_t;
>>     src/include/port/win32_port.h:typedef int uid_t;
>> but the problem is that port.h itself requires SIGNAL_ARGS to be defined
>> and that seems to be like chicken and egg problem.  I thought that just
>> using native "ints" could be the way to go, but the problem is that now
>> that uid_t can be bigger than pid_t as Linux kernel headers show this:
>> 
>> x86_64-linux-gnu/bits/types.h:#define   __S32_TYPE              int
>> x86_64-linux-gnu/bits/types.h:#define __U32_TYPE                unsigned int
>> x86_64-linux-gnu/bits/types.h:__STD_TYPE __UID_T_TYPE __uid_t;  /*
>> Type of user identifications.  */
>> x86_64-linux-gnu/bits/types.h:__STD_TYPE __PID_T_TYPE __pid_t;  /*
>> Type of process identifications.  */
>> x86_64-linux-gnu/bits/typesizes.h:#define __UID_T_TYPE          __U32_TYPE
>> x86_64-linux-gnu/bits/typesizes.h:#define __PID_T_TYPE          __S32_TYPE
>> 
>> so maybe do that typedef struct pg_signal_info with 2x uint32_t and that's
>> good enough? (it covers the ranges necessary and makes it platform 
>> compatible)
>> 
>> II. While we are tthis so with above uid_t of up to being u32, possibly
>> `volatile int ProcDieSenderUid/Pid` should be also bigger like uint32_t?
>> My fixup-patch does not incude it, because I don't know really.
>> 
>> III. As Chao said I've used:
>> 
>> +#define PG_SIG_DFL (pqsigfunc) (pg_funcptr_t) SIG_DFL
>> +#define PG_SIG_IGN (pqsigfunc) (pg_funcptr_t) SIG_IGN
>> 
>> IV.  Then just got lots of warnings for use_wrapper/wrapp_handler and so on
>> 
>> [09:27:33.602] ../src/port/pqsignal.c(206): error C2065:
>> 'use_wrapper': undeclared identifier
>> [09:27:33.602] ../src/port/pqsignal.c(206): warning C4113: 'pqsigfunc'
>> differs in parameter lists from 'void (__cdecl *)(int)'
>> 
>> that's for:
>>    204  #else
>>    205          /* Forward to Windows native signal system. */
>>    206          if (signal(signo, use_wrapper ? wrapper_handler :
>> func) == SIG_ERR)
>>    207                  Assert(false);                  /* probably
>> indicates coding error */
>> 
>> In the end, I've ended up using wrapper_handler for the windows path there
>> as signal() requires function with single param.
>> 
>> IV. Got some further issues, and VC complained that siginfo_t is used for
>> USE_SIGACTION - isn't it impossible on win32? Anyway, that makes some sense,
>> USE_SIGINFO is not defined and we use 'siginfo_t', so something like fixes 
>> it:
>> 
>> @@ -90,7 +90,7 @@ 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
>> 
>> V. Later I've stumbled on series of other problems related to
>> src/backend/port/win32/signal.c (it also uses SIG_DFL but not PG_SIG_DFL and
>> stil somewhat references pgsigfunc, so those changes seemed to impact it).
>> 
>> Also there was:
>> [10:37:02.824] ../src/backend/port/win32/signal.c(154): error C2198:
>> 'sig': too few arguments for call
>> 
>> so I've fixed with adding nodata struct there and:
>> @@ -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);
>> 
>> VI. Possibly we could rename USE_SIGACTION define because at least to me it
>> is confusing to me to reason and communicate about in terms of win32 context
>> on win32 do we do have it or not? (it can be both ways):
>> * win32 C API doesnt have it
>> * PG does have sigaction win32 wrapper with override macro
>>   #define sigaction.. pqsigaction..
>> * however src/include/libpq/pqsignal.h says "sa_sigaction not yet 
>> implemented"
>>   for it (so with USE_SIGACTION are we talking about sa_sigaction field 
>> memeber
>>   that it's not used or about sigaction function?)
>> 
>> VII. FWIW, I've also removed superflous "else"
>>  #ifdef USE_SIGINFO
>>         if (!(is_ign || is_dfl))
>>         {
>>                 act.sa_sigaction = wrapper_handler;
>>                 act.sa_flags |= SA_SIGINFO;
>>         }
>> -       else
>>  #else
>> 
>> 
> 
> 
> I'm not 100% sure that else shouldn't be there. Maybe have another look?
> 
> Attached is a consolidation that includes your other fixes, plus:
> 
> . uid comment -- "only meaningful when pid is not 0"
> . const pg_signal_info *pg_siginfo in SIGNAL_ARGS
> . 2 spaces after period in syncrep.c errdetail
> 
> 
> cheers
> 
> 
> andrew
> 
> 
> 
> --
> Andrew Dunstan
> EDB: https://www.enterprisedb.com
> <v2-0001-Rework-signal-handler-infrastructure-to-pass-send.patch>

V2 LGTM.

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/






Reply via email to