Staging
v0.5.1
v0.5.1
https://github.com/python/cpython
Revision d5aeccf9767c1619faa29e8ed61c93bde7bc5e3f authored by Victor Stinner on 31 August 2014, 13:07:57 UTC, committed by Victor Stinner on 31 August 2014, 13:07:57 UTC
There is a race condition in create_connection() used with wait_for() to have a timeout. sock_connect() registers the file descriptor of the socket to be notified of write event (if connect() raises BlockingIOError). When create_connection() is cancelled with a TimeoutError, sock_connect() coroutine gets the exception, but it doesn't unregister the file descriptor for write event. create_connection() gets the TimeoutError and closes the socket. If you call again create_connection(), the new socket will likely gets the same file descriptor, which is still registered in the selector. When sock_connect() calls add_writer(), it tries to modify the entry instead of creating a new one. This issue was originally reported in the Trollius project, but the bug comes from Tulip in fact (Trollius is based on Tulip): https://bitbucket.org/enovance/trollius/issue/15/after-timeouterror-on-wait_for This change fixes the race condition. It also makes sock_connect() more reliable (and portable) is sock.connect() raises an InterruptedError.
1 parent 41f3c3f
Tip revision: d5aeccf9767c1619faa29e8ed61c93bde7bc5e3f authored by Victor Stinner on 31 August 2014, 13:07:57 UTC
asyncio, Tulip issue 205: Fix a race condition in BaseSelectorEventLoop.sock_connect()
asyncio, Tulip issue 205: Fix a race condition in BaseSelectorEventLoop.sock_connect()
Tip revision: d5aeccf
File | Mode | Size |
---|---|---|
Python-ast.c | -rw-r--r-- | 223.6 KB |
_warnings.c | -rw-r--r-- | 29.7 KB |
asdl.c | -rw-r--r-- | 1.4 KB |
ast.c | -rw-r--r-- | 117.4 KB |
bltinmodule.c | -rw-r--r-- | 74.5 KB |
ceval.c | -rw-r--r-- | 147.3 KB |
ceval_gil.h | -rw-r--r-- | 8.9 KB |
codecs.c | -rw-r--r-- | 38.7 KB |
compile.c | -rw-r--r-- | 124.7 KB |
condvar.h | -rw-r--r-- | 11.0 KB |
dtoa.c | -rw-r--r-- | 81.3 KB |
dup2.c | -rw-r--r-- | 705 bytes |
dynamic_annotations.c | -rw-r--r-- | 6.6 KB |
dynload_aix.c | -rw-r--r-- | 5.6 KB |
dynload_dl.c | -rw-r--r-- | 509 bytes |
dynload_hpux.c | -rw-r--r-- | 1.8 KB |
dynload_next.c | -rw-r--r-- | 3.8 KB |
dynload_shlib.c | -rw-r--r-- | 3.3 KB |
dynload_stub.c | -rw-r--r-- | 186 bytes |
dynload_win.c | -rw-r--r-- | 9.5 KB |
errors.c | -rw-r--r-- | 29.9 KB |
fileutils.c | -rw-r--r-- | 26.8 KB |
formatter_unicode.c | -rw-r--r-- | 48.7 KB |
frozen.c | -rw-r--r-- | 1.6 KB |
frozenmain.c | -rw-r--r-- | 2.6 KB |
future.c | -rw-r--r-- | 4.6 KB |
getargs.c | -rw-r--r-- | 53.7 KB |
getcompiler.c | -rw-r--r-- | 366 bytes |
getcopyright.c | -rw-r--r-- | 511 bytes |
getopt.c | -rw-r--r-- | 3.4 KB |
getplatform.c | -rw-r--r-- | 130 bytes |
getversion.c | -rw-r--r-- | 289 bytes |
graminit.c | -rw-r--r-- | 41.3 KB |
import.c | -rw-r--r-- | 64.7 KB |
importdl.c | -rw-r--r-- | 3.6 KB |
importdl.h | -rw-r--r-- | 544 bytes |
importlib.h | -rw-r--r-- | 226.4 KB |
makeopcodetargets.py | -rwxr-xr-x | 1.2 KB |
marshal.c | -rw-r--r-- | 47.7 KB |
modsupport.c | -rw-r--r-- | 14.1 KB |
mysnprintf.c | -rw-r--r-- | 3.3 KB |
mystrtoul.c | -rw-r--r-- | 8.1 KB |
opcode_targets.h | -rw-r--r-- | 6.2 KB |
peephole.c | -rw-r--r-- | 24.8 KB |
pyarena.c | -rw-r--r-- | 5.5 KB |
pyctype.c | -rw-r--r-- | 7.7 KB |
pyfpe.c | -rw-r--r-- | 623 bytes |
pyhash.c | -rw-r--r-- | 13.0 KB |
pymath.c | -rw-r--r-- | 1.5 KB |
pystate.c | -rw-r--r-- | 25.2 KB |
pystrcmp.c | -rw-r--r-- | 613 bytes |
pystrtod.c | -rw-r--r-- | 38.2 KB |
pythonrun.c | -rw-r--r-- | 81.4 KB |
pytime.c | -rw-r--r-- | 6.5 KB |
random.c | -rw-r--r-- | 7.5 KB |
sigcheck.c | -rw-r--r-- | 529 bytes |
strdup.c | -rw-r--r-- | 247 bytes |
structmember.c | -rw-r--r-- | 8.7 KB |
symtable.c | -rw-r--r-- | 55.5 KB |
sysmodule.c | -rw-r--r-- | 62.3 KB |
thread.c | -rw-r--r-- | 12.4 KB |
thread_foobar.h | -rw-r--r-- | 1.4 KB |
thread_nt.h | -rw-r--r-- | 10.3 KB |
thread_pthread.h | -rw-r--r-- | 17.2 KB |
traceback.c | -rw-r--r-- | 17.3 KB |
Computing file changes ...