Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[3.6] bpo-30038: fix race condition in signal delivery + wakeup fd (#1082) #2075

Merged
merged 1 commit into from
Jun 10, 2017
Merged

[3.6] bpo-30038: fix race condition in signal delivery + wakeup fd (#1082) #2075

merged 1 commit into from
Jun 10, 2017

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