summaryrefslogtreecommitdiffstats
path: root/pym/_emerge
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-03-10 19:29:57 -0800
committerZac Medico <zmedico@gentoo.org>2011-03-14 09:23:29 -0700
commit48fad6f94aa044c638d5cad8851b4fed8e80309b (patch)
tree1b63222adef3b5882dbaa7468a7516a0dcd72d05 /pym/_emerge
parentef6643061e9c7f1447968d916cc876d91da59b76 (diff)
downloadportage-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.
Diffstat (limited to 'pym/_emerge')
-rw-r--r--pym/_emerge/Scheduler.py15
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 \