Re: Escaping from blocked send() reprised.

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема Re: Escaping from blocked send() reprised.
Дата
Msg-id 54086ED1.2060404@vmware.com
обсуждение исходный текст
Ответ на Re: Escaping from blocked send() reprised.  (Robert Haas <robertmhaas@gmail.com>)
Ответы Re: Escaping from blocked send() reprised.  (Robert Haas <robertmhaas@gmail.com>)
Список pgsql-hackers
On 09/04/2014 04:37 PM, Robert Haas wrote:
> Hrm.  So we'd have to block SIGUSR1, check the flag, then use
> pselect() to temporarily unblock SIGUSR1 and wait, then on return
> again unblock SIGUSR1?  Doesn't seem very appealing.  I think changing
> the signal mask is fast on Linux, but quite slow on at least some
> other UNIX-like platforms.  And I've heard that pselect() isn't always
> truly atomic, so we might run into platform-specific bugs, too.  I
> wonder if there's a better way e.g. using memory barriers.
>
> WaitLatch: check is_set.  if yes then done.  otherwise, set signal_me.
> memory barrier.  recheck is_set.  if not set then wait using
> poll/select. memory barrier.  clear signal_me.
> SetLatch: check is_set.  if yes then done.  otherwise, set is_set.
> memory barrier.  check signal_me.  if set, then send SIGUSR1.

Doesn't work. No matter what you do, the process running WaitLatch might 
receive the signal immediately before it calls poll/select. The signal 
handler will run, and the poll/select call will then go to sleep. There 
is no way to do this without support from the kernel, that is why 
ppoll/pselect exist.

- Heikki




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

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: psql \watch versus \timing
Следующее
От: Robert Haas
Дата:
Сообщение: Re: Patch for psql History Display on MacOSX