]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Tulip issue 196: _OverlappedFuture.set_result() now clears its reference to the
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 25 Jul 2014 22:58:34 +0000 (00:58 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 25 Jul 2014 22:58:34 +0000 (00:58 +0200)
overlapped object. IocpProactor._poll() now also ignores false alarms:
GetQueuedCompletionStatus() returns the overlapped but it is still pending.

Lib/asyncio/windows_events.py

index 65ecf340316e25dfa9f4b25184a2d44e22cd9926..3aa142c4fcf007b1609fe70a5091693e229057b5 100644 (file)
@@ -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):