Skip to content

Conversation

@vstinner
Copy link
Member

Before, it was possible to get the following sequence of
events (especially on Windows, where the C-level signal handler for
SIGINT is run in a separate thread):

  • SIGINT arrives
  • trip_signal is called
  • trip_signal writes to the wakeup fd
  • the main thread wakes up from select()-or-equivalent
  • the main thread checks for pending signals, but doesn't see any
  • the main thread drains the wakeup fd
  • the main thread goes back to sleep
  • trip_signal sets is_tripped=1 and calls Py_AddPendingCall to notify
    the main thread the it should run the Python-level signal handler
  • the main thread doesn't notice because it's asleep

This has been causing repeated failures in the Trio test suite:
python-trio/trio#119
(cherry picked from commit 4ae0149)

Before, it was possible to get the following sequence of
events (especially on Windows, where the C-level signal handler for
SIGINT is run in a separate thread):

- SIGINT arrives
- trip_signal is called
- trip_signal writes to the wakeup fd
- the main thread wakes up from select()-or-equivalent
- the main thread checks for pending signals, but doesn't see any
- the main thread drains the wakeup fd
- the main thread goes back to sleep
- trip_signal sets is_tripped=1 and calls Py_AddPendingCall to notify
  the main thread the it should run the Python-level signal handler
- the main thread doesn't notice because it's asleep

This has been causing repeated failures in the Trio test suite:
  python-trio/trio#119
(cherry picked from commit 4ae0149)
@vstinner vstinner merged commit 0b7629c into python:3.6 Jun 10, 2017
@vstinner vstinner deleted the signal36 branch June 10, 2017 09:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants