]> granicus.if.org Git - python/commit
Python issue #21645, Tulip issue 192: Rewrite signal handling
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 17 Jul 2014 20:43:40 +0000 (22:43 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 17 Jul 2014 20:43:40 +0000 (22:43 +0200)
commitfe5649c7b7bf52147480d6b1124a3d8e3597aee3
tree75eddcb18e9c7f4facecbb38732a6678dcad990d
parentddc8c8db1cd50d3b86cffbb1070ab32e3a14bbae
Python issue #21645, Tulip issue 192: Rewrite signal handling

Since Python 3.3, the C signal handler writes the signal number into the wakeup
file descriptor and then schedules the Python call using Py_AddPendingCall().

asyncio uses the wakeup file descriptor to wake up the event loop, and relies
on Py_AddPendingCall() to schedule the final callback with call_soon().

If the C signal handler is called in a thread different than the thread of the
event loop, the loop is awaken but Py_AddPendingCall() was not called yet. In
this case, the event loop has nothing to do and go to sleep again.
Py_AddPendingCall() is called while the event loop is sleeping again and so the
final callback is not scheduled immediatly.

This patch changes how asyncio handles signals. Instead of relying on
Py_AddPendingCall() and the wakeup file descriptor, asyncio now only relies on
the wakeup file descriptor. asyncio reads signal numbers from the wakeup file
descriptor to call its signal handler.
Lib/asyncio/proactor_events.py
Lib/asyncio/selector_events.py
Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_proactor_events.py
Lib/test/test_asyncio/test_unix_events.py