commit:     bcbf9ec87252658900f26aa957653a4db718152a
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sun Apr 29 02:02:08 2018 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sun Apr 29 02:04:24 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=bcbf9ec8

AbstractPollTask._wait_loop: asyncio compat (bug 653856)

Use the asyncio shim for asyncio compatibility.

Bug: https://bugs.gentoo.org/653856

 pym/_emerge/AbstractPollTask.py | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/pym/_emerge/AbstractPollTask.py b/pym/_emerge/AbstractPollTask.py
index d2965cc31..0aac97be5 100644
--- a/pym/_emerge/AbstractPollTask.py
+++ b/pym/_emerge/AbstractPollTask.py
@@ -7,6 +7,7 @@ import logging
 import os
 
 from portage.util import writemsg_level
+from portage.util.futures import asyncio
 from _emerge.AsynchronousTask import AsynchronousTask
 
 class AbstractPollTask(AsynchronousTask):
@@ -142,20 +143,15 @@ class AbstractPollTask(AsynchronousTask):
                return self.returncode
 
        def _wait_loop(self, timeout=None):
-
-               if timeout is None:
-                       while self._registered:
-                               self.scheduler.iteration()
-                       return
-
-               def timeout_cb():
-                       timeout_cb.timed_out = True
-                       return False
-               timeout_cb.timed_out = False
-               timeout_cb.timeout_id = self.scheduler.timeout_add(timeout, 
timeout_cb)
-
+               loop = getattr(self.scheduler, '_asyncio_wrapper', 
self.scheduler)
+               tasks = [self.async_wait()]
+               if timeout is not None:
+                       tasks.append(asyncio.ensure_future(
+                               asyncio.sleep(timeout / 1000, loop=loop), 
loop=loop))
                try:
-                       while self._registered and not timeout_cb.timed_out:
-                               self.scheduler.iteration()
+                       loop.run_until_complete(asyncio.ensure_future(
+                               asyncio.wait(tasks, 
return_when=asyncio.FIRST_COMPLETED,
+                               loop=loop), loop=loop))
                finally:
-                       self.scheduler.source_remove(timeout_cb.timeout_id)
+                       for task in tasks:
+                               task.cancel()

Reply via email to