aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-01-15 16:00:35 -0800
committerZac Medico <zmedico@gentoo.org>2011-01-15 16:00:35 -0800
commitc4451a1e94212025e060cfd8e6a2341527202086 (patch)
tree5080bcc79734a5f93086dac12192ea0d621060eb /pym/_emerge/actions.py
parentWhen killed by signal, return 128 + signum. (diff)
downloadportage-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.py67
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