Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/
Date: Sun, 29 Apr 2018 03:47:25
Message-Id: 1524973186.88ce275deabd4b260be916572639de800591a288.zmedico@gentoo
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()