Re: Tiny patch: sigmask.diff

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Tiny patch: sigmask.diff
Дата
Msg-id 30419.1459781336@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Tiny patch: sigmask.diff  (Aleksander Alekseev <a.alekseev@postgrespro.ru>)
Ответы Re: Tiny patch: sigmask.diff  (Aleksander Alekseev <a.alekseev@postgrespro.ru>)
Список pgsql-hackers
Aleksander Alekseev <a.alekseev@postgrespro.ru> writes:
> sigmask macro is defined in win32.h like this:
> #define sigmask(sig) ( 1 << ((sig)-1) )

> And used in signal.c in this fashion:
>         for (i = 0; i < PG_SIGNAL_COUNT; i++)
>             if (exec_mask & sigmask(i))

> Thus during first iteration we are doing `<< -1`. I think it's a bug.

Agreed.

> Patch attached.

Surely this fix is completely wrong?  You'd have to touch every use of
signum() to do it like that.  You'd also be introducing similarly-
undefined behavior at the other end of the loop, where this coding
would be asking to compute 1<<31, hence shifting into the sign bit,
which is undefined unless you make the computation explicitly unsigned.

I think better is just to change the for-loop to iterate from 1 not 0.
Signal 0 is invalid anyway, and is rejected in pg_queue_signal for
example, so there can't be any event waiting there.
        regards, tom lane



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: postgres_fdw : altering foreign table not invalidating prepare statement execution plan.
Следующее
От: Craig Ringer
Дата:
Сообщение: Re: Timeline following for logical slots