diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-01-15 16:00:35 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-01-16 12:33:32 -0800 |
commit | 9cb900a38fed06178d8c6281c2e9466187666732 (patch) | |
tree | a653f727ba08ba16e74be5837bb2605505fe7251 /pym/_emerge/Scheduler.py | |
parent | c8169e703374ab9efa4facd0a06994a85b6f87c2 (diff) | |
download | portage-9cb900a38fed06178d8c6281c2e9466187666732.tar.gz portage-9cb900a38fed06178d8c6281c2e9466187666732.tar.bz2 portage-9cb900a38fed06178d8c6281c2e9466187666732.zip |
Add PollScheduler.terminate() for interruption.
This allows PollScheduler instances to do basic cleanup and terminate
gracefully when SIGINT or SIGTERM signals are received.
Diffstat (limited to 'pym/_emerge/Scheduler.py')
-rw-r--r-- | pym/_emerge/Scheduler.py | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 11589ff40..c8301a298 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -1,4 +1,4 @@ -# Copyright 1999-2010 Gentoo Foundation +# Copyright 1999-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from __future__ import print_function @@ -292,6 +292,11 @@ class Scheduler(PollScheduler): self._running_portage = self._pkg(cpv, "installed", self._running_root, installed=True) + def _terminate_tasks(self): + self._status_display.quiet = True + for q in self._task_queues.values(): + q.clear() + def _init_graph(self, graph_config): """ Initialization structures used for dependency calculations @@ -1160,6 +1165,10 @@ class Scheduler(PollScheduler): while True: rval = self._merge() + + if self._terminated.is_set(): + return 1 + if rval == os.EX_OK or fetchonly or not keep_going: break if "resume" not in mtimedb: @@ -1398,9 +1407,9 @@ class Scheduler(PollScheduler): build_dir=build_dir, build_log=build_log, pkg=pkg, returncode=merge.returncode)) - self._failed_pkg_msg(self._failed_pkgs[-1], "install", "to") - - self._status_display.failed = len(self._failed_pkgs) + if not self._terminated.is_set(): + self._failed_pkg_msg(self._failed_pkgs[-1], "install", "to") + self._status_display.failed = len(self._failed_pkgs) return self._task_complete(pkg) @@ -1452,9 +1461,9 @@ class Scheduler(PollScheduler): build_dir=build_dir, build_log=build_log, pkg=build.pkg, returncode=build.returncode)) - self._failed_pkg_msg(self._failed_pkgs[-1], "emerge", "for") - - self._status_display.failed = len(self._failed_pkgs) + if not self._terminated.is_set(): + self._failed_pkg_msg(self._failed_pkgs[-1], "emerge", "for") + self._status_display.failed = len(self._failed_pkgs) self._deallocate_config(build.settings) self._jobs -= 1 self._status_display.running = self._jobs @@ -1631,7 +1640,7 @@ class Scheduler(PollScheduler): self._poll_loop() def _keep_scheduling(self): - return bool(self._pkg_queue and \ + return bool(not self._terminated.is_set() and self._pkg_queue and \ not (self._failed_pkgs and not self._build_opts.fetchonly)) def _is_work_scheduled(self): |