From 51e44ea66aefb4229e506263acf40d35596d279c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 26 Jul 2014 00:58:34 +0200 Subject: [PATCH] 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. --- Lib/asyncio/windows_events.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 65ecf340316..3aa142c4fcf 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -77,6 +77,10 @@ class _OverlappedFuture(futures.Future): super().set_exception(exception) self._cancel_overlapped() + def set_result(self, result): + super().set_result(result) + self._ov = None + class _WaitHandleFuture(futures.Future): """Subclass of Future which represents a wait handle.""" @@ -478,6 +482,13 @@ class IocpProactor: _winapi.CloseHandle(key) ms = 0 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: f.cancel() elif not f.cancelled(): @@ -489,11 +500,6 @@ class IocpProactor: else: f.set_result(value) 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 def _stop_serving(self, obj):