1 |
commit: 88ce275deabd4b260be916572639de800591a288 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sun Apr 29 03:39:46 2018 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Sun Apr 29 03:39:46 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=88ce275d |
7 |
|
8 |
Scheduler._main_loop: asyncio compat (bug 653856) |
9 |
|
10 |
Use create_future, call_later, and run_until_complete for |
11 |
asyncio compatibility. |
12 |
|
13 |
Bug: https://bugs.gentoo.org/653856 |
14 |
|
15 |
pym/_emerge/Scheduler.py | 44 +++++++++++++++++++++----------------------- |
16 |
1 file changed, 21 insertions(+), 23 deletions(-) |
17 |
|
18 |
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py |
19 |
index 6778708bb..4c1ea5078 100644 |
20 |
--- a/pym/_emerge/Scheduler.py |
21 |
+++ b/pym/_emerge/Scheduler.py |
22 |
@@ -71,8 +71,8 @@ FAILURE = 1 |
23 |
|
24 |
class Scheduler(PollScheduler): |
25 |
|
26 |
- # max time between loadavg checks (milliseconds) |
27 |
- _loadavg_latency = 30000 |
28 |
+ # max time between loadavg checks (seconds) |
29 |
+ _loadavg_latency = 30 |
30 |
|
31 |
# max time between display status updates (milliseconds) |
32 |
_max_display_latency = 3000 |
33 |
@@ -239,6 +239,8 @@ class Scheduler(PollScheduler): |
34 |
self._jobs = 0 |
35 |
self._running_tasks = {} |
36 |
self._completed_tasks = set() |
37 |
+ self._main_exit = None |
38 |
+ self._main_loadavg_handle = None |
39 |
|
40 |
self._failed_pkgs = [] |
41 |
self._failed_pkgs_all = [] |
42 |
@@ -1373,34 +1375,18 @@ class Scheduler(PollScheduler): |
43 |
blocker_db.discardBlocker(pkg) |
44 |
|
45 |
def _main_loop(self): |
46 |
- loadavg_check_id = None |
47 |
+ self._main_exit = self._event_loop.create_future() |
48 |
+ |
49 |
if self._max_load is not None and \ |
50 |
self._loadavg_latency is not None and \ |
51 |
(self._max_jobs is True or self._max_jobs > 1): |
52 |
# We have to schedule periodically, in case the load |
53 |
# average has changed since the last call. |
54 |
- loadavg_check_id = self._event_loop.timeout_add( |
55 |
+ self._main_loadavg_handle = self._event_loop.call_later( |
56 |
self._loadavg_latency, self._schedule) |
57 |
|
58 |
- try: |
59 |
- # Populate initial event sources. Unless we're scheduling |
60 |
- # based on load average, we only need to do this once |
61 |
- # here, since it can be called during the loop from within |
62 |
- # event handlers. |
63 |
- self._schedule() |
64 |
- |
65 |
- # Loop while there are jobs to be scheduled. |
66 |
- while self._keep_scheduling(): |
67 |
- self._event_loop.iteration() |
68 |
- |
69 |
- # Clean shutdown of previously scheduled jobs. In the |
70 |
- # case of termination, this allows for basic cleanup |
71 |
- # such as flushing of buffered output to logs. |
72 |
- while self._is_work_scheduled(): |
73 |
- self._event_loop.iteration() |
74 |
- finally: |
75 |
- if loadavg_check_id is not None: |
76 |
- self._event_loop.source_remove(loadavg_check_id) |
77 |
+ self._schedule() |
78 |
+ self._event_loop.run_until_complete(self._main_exit) |
79 |
|
80 |
def _merge(self): |
81 |
|
82 |
@@ -1441,6 +1427,10 @@ class Scheduler(PollScheduler): |
83 |
self._digraph = None |
84 |
self._task_queues.fetch.clear() |
85 |
self._prefetchers.clear() |
86 |
+ self._main_exit = None |
87 |
+ if self._main_loadavg_handle is not None: |
88 |
+ self._main_loadavg_handle.cancel() |
89 |
+ self._main_loadavg_handle = None |
90 |
|
91 |
def _choose_pkg(self): |
92 |
""" |
93 |
@@ -1606,6 +1596,14 @@ class Scheduler(PollScheduler): |
94 |
not self._task_queues.merge)): |
95 |
break |
96 |
|
97 |
+ if not (self._is_work_scheduled() or |
98 |
+ self._keep_scheduling() or self._main_exit.done()): |
99 |
+ self._main_exit.set_result(None) |
100 |
+ elif self._main_loadavg_handle is not None: |
101 |
+ self._main_loadavg_handle.cancel() |
102 |
+ self._main_loadavg_handle = self._event_loop.call_later( |
103 |
+ self._loadavg_latency, self._schedule) |
104 |
+ |
105 |
def _sigcont_handler(self, signum, frame): |
106 |
self._sigcont_time = time.time() |