Tulip issue 196: _OverlappedFuture.set_result() now clears its reference to the

overlapped object. IocpProactor._poll() now also ignores false alarms:
GetQueuedCompletionStatus() returns the overlapped but it is still pending.
This commit is contained in:
Victor Stinner 2014-07-26 00:58:34 +02:00
parent 5a2146a2fd
commit 51e44ea66a
1 changed files with 11 additions and 5 deletions

View File

@ -77,6 +77,10 @@ class _OverlappedFuture(futures.Future):
super().set_exception(exception) super().set_exception(exception)
self._cancel_overlapped() self._cancel_overlapped()
def set_result(self, result):
super().set_result(result)
self._ov = None
class _WaitHandleFuture(futures.Future): class _WaitHandleFuture(futures.Future):
"""Subclass of Future which represents a wait handle.""" """Subclass of Future which represents a wait handle."""
@ -478,6 +482,13 @@ class IocpProactor:
_winapi.CloseHandle(key) _winapi.CloseHandle(key)
ms = 0 ms = 0
continue continue
if ov.pending:
# False alarm: the overlapped operation is not completed.
# FIXME: why do we get false alarms?
self._cache[address] = (f, ov, obj, callback)
continue
if obj in self._stopped_serving: if obj in self._stopped_serving:
f.cancel() f.cancel()
elif not f.cancelled(): elif not f.cancelled():
@ -489,11 +500,6 @@ class IocpProactor:
else: else:
f.set_result(value) f.set_result(value)
self._results.append(f) self._results.append(f)
# FIXME, tulip issue #196: add _OverlappedFuture.set_result()
# method to clear the refrence, don't do it here (f may
# by a _WaitHandleFuture). Problem: clearing the reference
# in _register() if ov.pedding is False leads to weird bugs.
f._ov = None
ms = 0 ms = 0
def _stop_serving(self, obj): def _stop_serving(self, obj):