diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-03-10 19:29:57 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-03-14 09:23:29 -0700 |
commit | 48fad6f94aa044c638d5cad8851b4fed8e80309b (patch) | |
tree | 1b63222adef3b5882dbaa7468a7516a0dcd72d05 | |
parent | ef6643061e9c7f1447968d916cc876d91da59b76 (diff) | |
download | portage-48fad6f94aa044c638d5cad8851b4fed8e80309b.tar.gz portage-48fad6f94aa044c638d5cad8851b4fed8e80309b.tar.bz2 portage-48fad6f94aa044c638d5cad8851b4fed8e80309b.zip |
Scheduler: avoid infinite loop after CTRL-C
If CTRL-C was received at certain times, it was possible for discarded
tasks to be erroneously left in Scheduler._running_tasks, which would
cause the main loop to run infinitely. Thanks to David James
<davidjames@google.com> for reporting this issue and helping to devise
a solution.
-rw-r--r-- | pym/_emerge/Scheduler.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index e9c1b6a5e..306c945d7 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -295,6 +295,13 @@ class Scheduler(PollScheduler): def _terminate_tasks(self): self._status_display.quiet = True + # Remove running_tasks that have been added to queues but + # haven't been started yet, since we're going to discard + # them and their start/exit handlers won't be called. + for build in self._task_queues.jobs._task_queue: + self._running_tasks.remove(build.pkg) + for merge in self._task_queues.merge._task_queue: + self._running_tasks.remove(merge.merge.pkg) for q in self._task_queues.values(): q.clear() @@ -1469,7 +1476,13 @@ class Scheduler(PollScheduler): mtimedb.commit() def _build_exit(self, build): - if build.returncode == os.EX_OK: + if build.returncode == os.EX_OK and self._terminated.is_set(): + # We've been interrupted, so we won't + # add this to the merge queue. + self.curval += 1 + self._running_tasks.remove(build.pkg) + self._deallocate_config(build.settings) + elif build.returncode == os.EX_OK: self.curval += 1 merge = PackageMerge(merge=build) if not build.build_opts.buildpkgonly and \ |