1 |
commit: bcbf9ec87252658900f26aa957653a4db718152a |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Apr 29 02:02:08 2018 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun Apr 29 02:04:24 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=bcbf9ec8 |
7 |
|
8 |
AbstractPollTask._wait_loop: asyncio compat (bug 653856) |
9 |
|
10 |
Use the asyncio shim for asyncio compatibility. |
11 |
|
12 |
Bug: https://bugs.gentoo.org/653856 |
13 |
|
14 |
pym/_emerge/AbstractPollTask.py | 26 +++++++++++--------------- |
15 |
1 file changed, 11 insertions(+), 15 deletions(-) |
16 |
|
17 |
diff --git a/pym/_emerge/AbstractPollTask.py b/pym/_emerge/AbstractPollTask.py |
18 |
index d2965cc31..0aac97be5 100644 |
19 |
--- a/pym/_emerge/AbstractPollTask.py |
20 |
+++ b/pym/_emerge/AbstractPollTask.py |
21 |
@@ -7,6 +7,7 @@ import logging |
22 |
import os |
23 |
|
24 |
from portage.util import writemsg_level |
25 |
+from portage.util.futures import asyncio |
26 |
from _emerge.AsynchronousTask import AsynchronousTask |
27 |
|
28 |
class AbstractPollTask(AsynchronousTask): |
29 |
@@ -142,20 +143,15 @@ class AbstractPollTask(AsynchronousTask): |
30 |
return self.returncode |
31 |
|
32 |
def _wait_loop(self, timeout=None): |
33 |
- |
34 |
- if timeout is None: |
35 |
- while self._registered: |
36 |
- self.scheduler.iteration() |
37 |
- return |
38 |
- |
39 |
- def timeout_cb(): |
40 |
- timeout_cb.timed_out = True |
41 |
- return False |
42 |
- timeout_cb.timed_out = False |
43 |
- timeout_cb.timeout_id = self.scheduler.timeout_add(timeout, timeout_cb) |
44 |
- |
45 |
+ loop = getattr(self.scheduler, '_asyncio_wrapper', self.scheduler) |
46 |
+ tasks = [self.async_wait()] |
47 |
+ if timeout is not None: |
48 |
+ tasks.append(asyncio.ensure_future( |
49 |
+ asyncio.sleep(timeout / 1000, loop=loop), loop=loop)) |
50 |
try: |
51 |
- while self._registered and not timeout_cb.timed_out: |
52 |
- self.scheduler.iteration() |
53 |
+ loop.run_until_complete(asyncio.ensure_future( |
54 |
+ asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED, |
55 |
+ loop=loop), loop=loop)) |
56 |
finally: |
57 |
- self.scheduler.source_remove(timeout_cb.timeout_id) |
58 |
+ for task in tasks: |
59 |
+ task.cancel() |