diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-01-15 16:00:35 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-01-15 16:00:35 -0800 |
commit | c4451a1e94212025e060cfd8e6a2341527202086 (patch) | |
tree | 5080bcc79734a5f93086dac12192ea0d621060eb /pym/_emerge/actions.py | |
parent | e2a3237b4018e274350488868577c4d74a496b85 (diff) | |
download | portage-c4451a1e94212025e060cfd8e6a2341527202086.tar.gz portage-c4451a1e94212025e060cfd8e6a2341527202086.tar.bz2 portage-c4451a1e94212025e060cfd8e6a2341527202086.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/actions.py')
-rw-r--r-- | pym/_emerge/actions.py | 67 |
1 files changed, 56 insertions, 11 deletions
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 8d30752f3..37debe0b1 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -420,11 +420,7 @@ def action_build(settings, trees, mtimedb, mergetask = Scheduler(settings, trees, mtimedb, myopts, spinner, favorites=favorites, graph_config=mydepgraph.schedulerGraph()) - del mydepgraph - clear_caches(trees) - retval = mergetask.merge() - merge_count = mergetask.curval else: if "resume" in mtimedb and \ "mergelist" in mtimedb["resume"] and \ @@ -434,14 +430,40 @@ def action_build(settings, trees, mtimedb, mtimedb.commit() mydepgraph.saveNomergeFavorites() - mergetask = Scheduler(settings, trees, mtimedb, myopts, - spinner, favorites=favorites, - graph_config=mydepgraph.schedulerGraph()) - del mydepgraph - clear_caches(trees) + mergetask = Scheduler(settings, trees, mtimedb, myopts, + spinner, favorites=favorites, + graph_config=mydepgraph.schedulerGraph()) + + del mydepgraph + clear_caches(trees) + + received_signal = [] + + def emergeexitsig(signum, frame): + signal.signal(signal.SIGINT, signal.SIG_IGN) + signal.signal(signal.SIGTERM, signal.SIG_IGN) + portage.util.writemsg("\n\nExiting on signal %(signal)s\n" % \ + {"signal":signum}) + mergetask.terminate() + received_signal.append(128 + signum) + + earlier_sigint_handler = signal.signal(signal.SIGINT, emergeexitsig) + earlier_sigterm_handler = signal.signal(signal.SIGTERM, emergeexitsig) + + try: retval = mergetask.merge() - merge_count = mergetask.curval + + if received_signal: + sys.exit(received_signal[0]) + finally: + # Restore previous handlers + if earlier_sigint_handler is not None: + signal.signal(signal.SIGINT, earlier_sigint_handler) + if earlier_sigterm_handler is not None: + signal.signal(signal.SIGTERM, earlier_sigterm_handler) + + merge_count = mergetask.curval if retval == os.EX_OK and not (buildpkgonly or fetchonly or pretend): if "yes" == settings.get("AUTOCLEAN"): @@ -1819,7 +1841,30 @@ def action_regen(settings, portdb, max_jobs, max_load): sys.stdout.flush() regen = MetadataRegen(portdb, max_jobs=max_jobs, max_load=max_load) - regen.run() + received_signal = [] + + def emergeexitsig(signum, frame): + signal.signal(signal.SIGINT, signal.SIG_IGN) + signal.signal(signal.SIGTERM, signal.SIG_IGN) + portage.util.writemsg("\n\nExiting on signal %(signal)s\n" % \ + {"signal":signum}) + regen.terminate() + received_signal.append(128 + signum) + + earlier_sigint_handler = signal.signal(signal.SIGINT, emergeexitsig) + earlier_sigterm_handler = signal.signal(signal.SIGTERM, emergeexitsig) + + try: + regen.run() + + if received_signal: + sys.exit(received_signal[0]) + finally: + # Restore previous handlers + if earlier_sigint_handler is not None: + signal.signal(signal.SIGINT, earlier_sigint_handler) + if earlier_sigterm_handler is not None: + signal.signal(signal.SIGTERM, earlier_sigterm_handler) portage.writemsg_stdout("done!\n") return regen.returncode |