diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-07-29 11:39:35 +0200 |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-07-29 11:39:35 +0200 |
commit | 36cceb22e01f3977402c3fdb9b1d838420d5b818 (patch) | |
tree | 2a17cc0131c84fa5c9a7bf950680e57e0fa73e8b | |
parent | 7cce2766a3cea9ebc2791538030b67f3b88d3895 (diff) | |
download | trollius-36cceb22e01f3977402c3fdb9b1d838420d5b818.tar.gz |
Optimize IocpProactor.wait_for_handle() gets the result if the wait is signaled
immediatly.
-rw-r--r-- | asyncio/windows_events.py | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/asyncio/windows_events.py b/asyncio/windows_events.py index 03146ca..40991ff 100644 --- a/asyncio/windows_events.py +++ b/asyncio/windows_events.py @@ -102,7 +102,7 @@ class _WaitHandleFuture(futures.Future): % (state, self._wait_handle)) return info - def _unregister(self): + def _unregister_wait(self): if self._wait_handle is None: return try: @@ -114,8 +114,17 @@ class _WaitHandleFuture(futures.Future): self._wait_handle = None def cancel(self): - self._unregister() - return super().cancel() + result = super().cancel() + self._unregister_wait() + return result + + def set_exception(self, exception): + super().set_exception(exception) + self._unregister_wait() + + def set_result(self, result): + super().set_result(result) + self._unregister_wait() class PipeServer(object): @@ -411,10 +420,15 @@ class IocpProactor: # or semaphores are not. Also note if the handle is # signalled and then quickly reset, then we may return # False even though we have not timed out. + return f._poll() + + if f._poll(): try: - return f._poll() - finally: - f._unregister() + result = f._poll() + except OSError as exc: + f.set_exception(exc) + else: + f.set_result(result) self._cache[ov.address] = (f, ov, None, finish_wait_for_handle) return f |