Skip to content

Commit

Permalink
bpo-39651: Fix asyncio proactor _write_to_self() (pythonGH-22197)
Browse files Browse the repository at this point in the history
Fix a race condition in the call_soon_threadsafe() method of
asyncio.ProactorEventLoop: do nothing if the self-pipe socket has
been closed.
  • Loading branch information
vstinner committed Sep 12, 2020
1 parent 7e711ea commit 1b0f0e3
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 9 deletions.
11 changes: 10 additions & 1 deletion Lib/asyncio/proactor_events.py
Expand Up @@ -793,8 +793,17 @@ def _loop_self_reading(self, f=None):
f.add_done_callback(self._loop_self_reading)

def _write_to_self(self):
# This may be called from a different thread, possibly after
# _close_self_pipe() has been called or even while it is
# running. Guard for self._csock being None or closed. When
# a socket is closed, send() raises OSError (with errno set to
# EBADF, but let's not rely on the exact error code).
csock = self._csock
if csock is None:
return

try:
self._csock.send(b'\0')
csock.send(b'\0')
except OSError:
if self._debug:
logger.debug("Fail to write a null byte into the "
Expand Down
18 changes: 10 additions & 8 deletions Lib/asyncio/selector_events.py
Expand Up @@ -133,14 +133,16 @@ def _write_to_self(self):
# a socket is closed, send() raises OSError (with errno set to
# EBADF, but let's not rely on the exact error code).
csock = self._csock
if csock is not None:
try:
csock.send(b'\0')
except OSError:
if self._debug:
logger.debug("Fail to write a null byte into the "
"self-pipe socket",
exc_info=True)
if csock is None:
return

try:
csock.send(b'\0')
except OSError:
if self._debug:
logger.debug("Fail to write a null byte into the "
"self-pipe socket",
exc_info=True)

def _start_serving(self, protocol_factory, sock,
sslcontext=None, server=None, backlog=100,
Expand Down
@@ -0,0 +1,3 @@
Fix a race condition in the ``call_soon_threadsafe()`` method of
``asyncio.ProactorEventLoop``: do nothing if the self-pipe socket has been
closed.

0 comments on commit 1b0f0e3

Please sign in to comment.