From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 7CE0C1382C5 for ; Sun, 29 Apr 2018 03:47:25 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 9979FE081E; Sun, 29 Apr 2018 03:47:24 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 5C8D4E081E for ; Sun, 29 Apr 2018 03:47:24 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id BEF1E335C78 for ; Sun, 29 Apr 2018 03:47:22 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 36AB8290 for ; Sun, 29 Apr 2018 03:47:21 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: <1524973186.88ce275deabd4b260be916572639de800591a288.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/Scheduler.py X-VCS-Directories: pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 88ce275deabd4b260be916572639de800591a288 X-VCS-Branch: master Date: Sun, 29 Apr 2018 03:47:21 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Archives-Salt: 2ad54f0d-907a-4a55-8dfb-f60379ea8cba X-Archives-Hash: eae7b1fb811b875cf65629a370c775a5 commit: 88ce275deabd4b260be916572639de800591a288 Author: Zac Medico gentoo org> AuthorDate: Sun Apr 29 03:39:46 2018 +0000 Commit: Zac Medico gentoo org> CommitDate: Sun Apr 29 03:39:46 2018 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=88ce275d Scheduler._main_loop: asyncio compat (bug 653856) Use create_future, call_later, and run_until_complete for asyncio compatibility. Bug: https://bugs.gentoo.org/653856 pym/_emerge/Scheduler.py | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 6778708bb..4c1ea5078 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -71,8 +71,8 @@ FAILURE = 1 class Scheduler(PollScheduler): - # max time between loadavg checks (milliseconds) - _loadavg_latency = 30000 + # max time between loadavg checks (seconds) + _loadavg_latency = 30 # max time between display status updates (milliseconds) _max_display_latency = 3000 @@ -239,6 +239,8 @@ class Scheduler(PollScheduler): self._jobs = 0 self._running_tasks = {} self._completed_tasks = set() + self._main_exit = None + self._main_loadavg_handle = None self._failed_pkgs = [] self._failed_pkgs_all = [] @@ -1373,34 +1375,18 @@ class Scheduler(PollScheduler): blocker_db.discardBlocker(pkg) def _main_loop(self): - loadavg_check_id = None + self._main_exit = self._event_loop.create_future() + if self._max_load is not None and \ self._loadavg_latency is not None and \ (self._max_jobs is True or self._max_jobs > 1): # We have to schedule periodically, in case the load # average has changed since the last call. - loadavg_check_id = self._event_loop.timeout_add( + self._main_loadavg_handle = self._event_loop.call_later( self._loadavg_latency, self._schedule) - try: - # Populate initial event sources. Unless we're scheduling - # based on load average, we only need to do this once - # here, since it can be called during the loop from within - # event handlers. - self._schedule() - - # Loop while there are jobs to be scheduled. - while self._keep_scheduling(): - self._event_loop.iteration() - - # Clean shutdown of previously scheduled jobs. In the - # case of termination, this allows for basic cleanup - # such as flushing of buffered output to logs. - while self._is_work_scheduled(): - self._event_loop.iteration() - finally: - if loadavg_check_id is not None: - self._event_loop.source_remove(loadavg_check_id) + self._schedule() + self._event_loop.run_until_complete(self._main_exit) def _merge(self): @@ -1441,6 +1427,10 @@ class Scheduler(PollScheduler): self._digraph = None self._task_queues.fetch.clear() self._prefetchers.clear() + self._main_exit = None + if self._main_loadavg_handle is not None: + self._main_loadavg_handle.cancel() + self._main_loadavg_handle = None def _choose_pkg(self): """ @@ -1606,6 +1596,14 @@ class Scheduler(PollScheduler): not self._task_queues.merge)): break + if not (self._is_work_scheduled() or + self._keep_scheduling() or self._main_exit.done()): + self._main_exit.set_result(None) + elif self._main_loadavg_handle is not None: + self._main_loadavg_handle.cancel() + self._main_loadavg_handle = self._event_loop.call_later( + self._loadavg_latency, self._schedule) + def _sigcont_handler(self, signum, frame): self._sigcont_time = time.time()