From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1PxvR1-00040x-FC for garchives@archives.gentoo.org; Fri, 11 Mar 2011 06:02:47 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id C3805E04F2; Fri, 11 Mar 2011 06:02:38 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 82FA81C02D for ; Fri, 11 Mar 2011 06:02:38 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 04FD01B401D for ; Fri, 11 Mar 2011 06:02:38 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 5AE4E8006E for ; Fri, 11 Mar 2011 06:02:37 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: <9411ac7406c6e775998bf6055ca8f022acce9e25.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/MetadataRegen.py pym/_emerge/PollScheduler.py pym/_emerge/QueueScheduler.py pym/_emerge/Scheduler.py X-VCS-Directories: pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 9411ac7406c6e775998bf6055ca8f022acce9e25 Date: Fri, 11 Mar 2011 06:02:37 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: f646713f6552047c306cf32ac271e1c6 commit: 9411ac7406c6e775998bf6055ca8f022acce9e25 Author: Zac Medico gentoo org> AuthorDate: Fri Mar 11 06:02:19 2011 +0000 Commit: Zac Medico gentoo org> CommitDate: Fri Mar 11 06:02:19 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/portage.git;a= =3Dcommit;h=3D9411ac74 PollScheduler: tweek termination logic * PollScheduler and all subclasses now use the _terminated_tasks variable to check whether or not _terminate_tasks() has been called, and behave appropriately in that case. * The _schedule_tasks() method now has documentation about the relationship with _terminate_tasks() and _terminated_tasks. --- pym/_emerge/MetadataRegen.py | 15 ++++++++------- pym/_emerge/PollScheduler.py | 21 +++++++++++++++++++++ pym/_emerge/QueueScheduler.py | 3 +++ pym/_emerge/Scheduler.py | 8 ++++---- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/pym/_emerge/MetadataRegen.py b/pym/_emerge/MetadataRegen.py index 45c4f4d..8103175 100644 --- a/pym/_emerge/MetadataRegen.py +++ b/pym/_emerge/MetadataRegen.py @@ -44,7 +44,7 @@ class MetadataRegen(PollScheduler): portage.writemsg_stdout("Regenerating cache entries...\n") every_cp.sort(reverse=3DTrue) try: - while not self._terminated.is_set(): + while not self._terminated_tasks: yield every_cp.pop() except IndexError: pass @@ -56,13 +56,13 @@ class MetadataRegen(PollScheduler): consumer =3D self._consumer =20 for cp in self._cp_iter: - if self._terminated.is_set(): + if self._terminated_tasks: break cp_set.add(cp) portage.writemsg_stdout("Processing %s\n" % cp) cpv_list =3D portdb.cp_list(cp) for cpv in cpv_list: - if self._terminated.is_set(): + if self._terminated_tasks: break valid_pkgs.add(cpv) ebuild_path, repo_path =3D portdb.findname2(cpv) @@ -94,7 +94,7 @@ class MetadataRegen(PollScheduler): while self._jobs: self._poll_loop() =20 - if self._terminated.is_set(): + if self._terminated_tasks: self.returncode =3D 1 return =20 @@ -145,9 +145,10 @@ class MetadataRegen(PollScheduler): @returns: True if there may be remaining tasks to schedule, False otherwise. """ + if self._terminated_tasks: + return False + while self._can_add_job(): - if self._terminated.is_set(): - return False try: metadata_process =3D next(self._process_iter) except StopIteration: @@ -167,7 +168,7 @@ class MetadataRegen(PollScheduler): self.returncode =3D 1 self._error_count +=3D 1 self._valid_pkgs.discard(metadata_process.cpv) - if not self._terminated.is_set(): + if not self._terminated_tasks: portage.writemsg("Error processing %s, continuing...\n" % \ (metadata_process.cpv,), noiselevel=3D-1) =20 diff --git a/pym/_emerge/PollScheduler.py b/pym/_emerge/PollScheduler.py index 94fd924..8f4bd64 100644 --- a/pym/_emerge/PollScheduler.py +++ b/pym/_emerge/PollScheduler.py @@ -65,6 +65,24 @@ class PollScheduler(object): """ raise NotImplementedError() =20 + def _schedule_tasks(self): + """ + This is called from inside the _schedule() method, which + guarantees the following: + + 1) It will not be called recursively. + 2) _terminate_tasks() will not be called while it is running. + 3) The state of the boolean _terminated_tasks variable will + not change while it is running. + + Unless this method is used to perform user interface updates, + or something like that, the first thing it should do is check + the state of _terminated_tasks and if that is True then it + should return False immediately (since there's no need to + schedule anything after _terminate_tasks() has been called). + """ + raise NotImplementedError() + def _schedule(self): """ Calls _schedule_tasks() and automatically returns early from @@ -90,6 +108,9 @@ class PollScheduler(object): return self._jobs =20 def _can_add_job(self): + if self._terminated_tasks: + return False + max_jobs =3D self._max_jobs max_load =3D self._max_load =20 diff --git a/pym/_emerge/QueueScheduler.py b/pym/_emerge/QueueScheduler.p= y index 8a7ea30..2d727c9 100644 --- a/pym/_emerge/QueueScheduler.py +++ b/pym/_emerge/QueueScheduler.py @@ -79,6 +79,9 @@ class QueueScheduler(PollScheduler): @returns: True if there may be remaining tasks to schedule, False otherwise. """ + if self._terminated_tasks: + return False + while self._can_add_job(): n =3D self._max_jobs - self._running_job_count() if n < 1: diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 9f72856..c616120 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -1443,7 +1443,7 @@ class Scheduler(PollScheduler): build_dir=3Dbuild_dir, build_log=3Dbuild_log, pkg=3Dpkg, returncode=3Dmerge.returncode)) - if not self._terminated.is_set(): + if not self._terminated_tasks: self._failed_pkg_msg(self._failed_pkgs[-1], "install", "to") self._status_display.failed =3D len(self._failed_pkgs) return @@ -1478,7 +1478,7 @@ class Scheduler(PollScheduler): mtimedb.commit() =20 def _build_exit(self, build): - if build.returncode =3D=3D os.EX_OK and self._terminated.is_set(): + if build.returncode =3D=3D os.EX_OK and self._terminated_tasks: # We've been interrupted, so we won't # add this to the merge queue. self.curval +=3D 1 @@ -1507,7 +1507,7 @@ class Scheduler(PollScheduler): build_dir=3Dbuild_dir, build_log=3Dbuild_log, pkg=3Dbuild.pkg, returncode=3Dbuild.returncode)) - if not self._terminated.is_set(): + if not self._terminated_tasks: self._failed_pkg_msg(self._failed_pkgs[-1], "emerge", "for") self._status_display.failed =3D len(self._failed_pkgs) self._deallocate_config(build.settings) @@ -1687,7 +1687,7 @@ class Scheduler(PollScheduler): self._poll_loop() =20 def _keep_scheduling(self): - return bool(not self._terminated.is_set() and self._pkg_queue and \ + return bool(not self._terminated_tasks and self._pkg_queue and \ not (self._failed_pkgs and not self._build_opts.fetchonly)) =20 def _is_work_scheduled(self):