[Python-ideas] Importance of noticing new signals
Koos Zevenhoven
k7hoven at gmail.com
Thu Nov 2 08:57:12 EDT 2017
On Thu, Nov 2, 2017 at 2:22 PM, Antoine Pitrou <solipsis at pitrou.net> wrote:
> On Wed, 1 Nov 2017 20:29:56 +0200
> Koos Zevenhoven <k7hoven at gmail.com> wrote:
> >
> > From a correctness point of view, that is absolutely great: if
> > PyErr_CheckSignals() is called, it is guaranteed to notice a new signal
> > regardles of how small the number of picoseconds after the `is_tripped`
> > flag has been set. But is that really important?
>
> I was going to answer "no"... but actually yes. The important case is
> the event loop type case:
>
> while (1) {
> select([some file descriptors]);
> if (errno == EINTR) {
> PyErr_CheckSignals();
> if (PyErr_Occurred()) break;
> }
> /* continue select()ing... */
> }
>
> Now say at a given point in time, no fds are actually active (or even
> waited for), but some signal arrives (SIGINT perhaps).
> select() is woken up and returns with errno EINTR. Two things then can
> happen:
>
> - if PyErr_CheckSignals() notices the signal, it will run the relevant
> signal handler, which may raise an exception and trigger the select()
> loop to exit (e.g. SIGINT would raise KeyboardInterrupt)
>
> - if PyErr_CheckSignals() misses the signal, the loop will enter again,
> and select() may sleep for an infinite amount of time
>
>
Oh! So that would provide a proper reason for my just-in-case decision to
name the faster near-equivalent functionality PyErr_PROBE_SIGNALS instead
of PyErr_CHECK_SIGNALS.
Cross-referencing to that (thread about making Ctrl-C "always" work):
https://mail.python.org/pipermail/python-ideas/2017-November/047631.html
Of course, what we're doing with select() above can already apply for
> read() or other interruptible syscalls waiting for outside data... and
> that pattern is present a lot internally, especially since
> PEP 475 ("Retry system calls failing with EINTR").
>
> Now, is the "sequentially consistent" ordering on is_tripped sufficient
> to guarantee that signals won't be missed on a weak-ordering platform?
> I *think* so, but an expert would need to check that code (or we
> cross our fingers and wait for a hypothetical bug report).
>
>
I think the question is: Do we know for sure that is_tripped has been
stored using sequentially consistent ordering prior to the call to
PyErr_CheckSignals(), even if an interruptible syscall is involved? I
suppose so?
(But this is a separate question from the problem I was solving, of course.
I'm not proposing to remove PyErr_CheckSignals())
––Koos
> Regards
>
> Antoine.
>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
--
+ Koos Zevenhoven + http://twitter.com/k7hoven +
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171102/d0a3d05b/attachment.html>
More information about the Python-ideas
mailing list