diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-01-15 19:43:35 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-01-16 12:33:58 -0800 |
commit | 7acdb0fcde50afbbc93f84caa2dab41d8d78300d (patch) | |
tree | 4d36eeedfa6985013fae36ec390b909767e2bd5f /pym/_emerge/Scheduler.py | |
parent | 8f743b9871c5d348ab9caab7910b9333ea051901 (diff) | |
download | portage-7acdb0fcde50afbbc93f84caa2dab41d8d78300d.tar.gz portage-7acdb0fcde50afbbc93f84caa2dab41d8d78300d.tar.bz2 portage-7acdb0fcde50afbbc93f84caa2dab41d8d78300d.zip |
Tweak PollScheduler signal handling.
Diffstat (limited to 'pym/_emerge/Scheduler.py')
-rw-r--r-- | pym/_emerge/Scheduler.py | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index c8301a298..7f38dedc4 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -7,6 +7,7 @@ import gc import gzip import logging import shutil +import signal import sys import tempfile import textwrap @@ -1164,10 +1165,35 @@ class Scheduler(PollScheduler): return rval while True: - rval = self._merge() - if self._terminated.is_set(): - return 1 + received_signal = [] + + def sighandler(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}) + self.terminate() + received_signal.append(128 + signum) + + earlier_sigint_handler = signal.signal(signal.SIGINT, sighandler) + earlier_sigterm_handler = signal.signal(signal.SIGTERM, sighandler) + + try: + rval = self._merge() + finally: + # Restore previous handlers + if earlier_sigint_handler is not None: + signal.signal(signal.SIGINT, earlier_sigint_handler) + else: + signal.signal(signal.SIGINT, signal.SIG_DFL) + if earlier_sigterm_handler is not None: + signal.signal(signal.SIGTERM, earlier_sigterm_handler) + else: + signal.signal(signal.SIGTERM, signal.SIG_DFL) + + if received_signal: + sys.exit(received_signal[0]) if rval == os.EX_OK or fetchonly or not keep_going: break |