From: Victor Stinner Date: Fri, 25 Jul 2014 22:58:34 +0000 (+0200) Subject: Tulip issue 196: _OverlappedFuture.set_result() now clears its reference to the X-Git-Tag: v3.4.2rc1~185 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=51e44ea66aefb4229e506263acf40d35596d279c;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 65ecf340316e..3aa142c4fcf0 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):