Staging
v0.8.1
v0.8.1
https://github.com/python/cpython
Revision d0a28dee78d099fcadc71147cba4affb6efa0c97 authored by Victor Stinner on 21 January 2015, 22:39:51 UTC, committed by Victor Stinner on 21 January 2015, 22:39:51 UTC
This change fixes a race conditon related to _WaitHandleFuture.cancel() leading to Python crash or "GetQueuedCompletionStatus() returned an unexpected event" logs. Before, the overlapped object was destroyed too early, it was possible that the wait completed whereas the overlapped object was already destroyed. Sometimes, a different overlapped was allocated at the same address, leading to unexpected completition. _WaitHandleFuture.cancel() now waits until the wait is cancelled to clear its reference to the overlapped object. To wait until the cancellation is done, UnregisterWaitEx() is used with an event instead of UnregisterWait(). To wait for this event, a new _WaitCancelFuture class was added. It's a simplified version of _WaitCancelFuture. For example, its cancel() method calls UnregisterWait(), not UnregisterWaitEx(). _WaitCancelFuture should not be cancelled. The overlapped object is kept alive in _WaitHandleFuture until the wait is unregistered. Other changes: * Add _overlapped.UnregisterWaitEx() * Remove fast-path in IocpProactor.wait_for_handle() to immediatly set the result if the wait already completed. I'm not sure that it's safe to call immediatly UnregisterWaitEx() before the completion was signaled. * Add IocpProactor._unregistered() to forget an overlapped which may never be signaled, but may be signaled for the next loop iteration. It avoids to block forever IocpProactor.close() if a wait was cancelled, and it may also avoid some "... unexpected event ..." warnings.
1 parent 442b0ad
Tip revision: d0a28dee78d099fcadc71147cba4affb6efa0c97 authored by Victor Stinner on 21 January 2015, 22:39:51 UTC
Issue #23095, asyncio: Rewrite _WaitHandleFuture.cancel()
Issue #23095, asyncio: Rewrite _WaitHandleFuture.cancel()
Tip revision: d0a28de
File | Mode | Size |
---|---|---|
Doc | ||
Grammar | ||
Include | ||
Lib | ||
Mac | ||
Misc | ||
Modules | ||
Objects | ||
PC | ||
PCbuild | ||
Parser | ||
Python | ||
Tools | ||
.bzrignore | -rw-r--r-- | 584 bytes |
.gitignore | -rw-r--r-- | 971 bytes |
.hgeol | -rw-r--r-- | 800 bytes |
.hgignore | -rw-r--r-- | 1.3 KB |
.hgtags | -rw-r--r-- | 6.9 KB |
.hgtouch | -rw-r--r-- | 1.2 KB |
LICENSE | -rw-r--r-- | 12.5 KB |
Makefile.pre.in | -rw-r--r-- | 54.0 KB |
README | -rw-r--r-- | 6.6 KB |
config.guess | -rwxr-xr-x | 41.9 KB |
config.sub | -rwxr-xr-x | 34.9 KB |
configure | -rwxr-xr-x | 440.2 KB |
configure.ac | -rw-r--r-- | 138.6 KB |
install-sh | -rwxr-xr-x | 7.0 KB |
pyconfig.h.in | -rw-r--r-- | 40.2 KB |
setup.py | -rw-r--r-- | 95.2 KB |
Computing file changes ...