bpo-39651: Fix asyncio proactor _write_to_self() (GH-22197)
Fix a race condition in the call_soon_threadsafe() method of asyncio.ProactorEventLoop: do nothing if the self-pipe socket has been closed.
This commit is contained in:
parent
7e711ead26
commit
1b0f0e3d7d
|
@ -793,8 +793,17 @@ class BaseProactorEventLoop(base_events.BaseEventLoop):
|
||||||
f.add_done_callback(self._loop_self_reading)
|
f.add_done_callback(self._loop_self_reading)
|
||||||
|
|
||||||
def _write_to_self(self):
|
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:
|
try:
|
||||||
self._csock.send(b'\0')
|
csock.send(b'\0')
|
||||||
except OSError:
|
except OSError:
|
||||||
if self._debug:
|
if self._debug:
|
||||||
logger.debug("Fail to write a null byte into the "
|
logger.debug("Fail to write a null byte into the "
|
||||||
|
|
|
@ -133,14 +133,16 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop):
|
||||||
# a socket is closed, send() raises OSError (with errno set to
|
# a socket is closed, send() raises OSError (with errno set to
|
||||||
# EBADF, but let's not rely on the exact error code).
|
# EBADF, but let's not rely on the exact error code).
|
||||||
csock = self._csock
|
csock = self._csock
|
||||||
if csock is not None:
|
if csock is None:
|
||||||
try:
|
return
|
||||||
csock.send(b'\0')
|
|
||||||
except OSError:
|
try:
|
||||||
if self._debug:
|
csock.send(b'\0')
|
||||||
logger.debug("Fail to write a null byte into the "
|
except OSError:
|
||||||
"self-pipe socket",
|
if self._debug:
|
||||||
exc_info=True)
|
logger.debug("Fail to write a null byte into the "
|
||||||
|
"self-pipe socket",
|
||||||
|
exc_info=True)
|
||||||
|
|
||||||
def _start_serving(self, protocol_factory, sock,
|
def _start_serving(self, protocol_factory, sock,
|
||||||
sslcontext=None, server=None, backlog=100,
|
sslcontext=None, server=None, backlog=100,
|
||||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue