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 /bin | |
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 'bin')
-rwxr-xr-x | bin/egencache | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/bin/egencache b/bin/egencache index 2fb30a07c..bf729c380 100755 --- a/bin/egencache +++ b/bin/egencache @@ -258,7 +258,30 @@ class GenCache(object): level=logging.ERROR, noiselevel=-1) def run(self): - self._regen.run() + + received_signal = [] + + def sighandler(signum, frame): + signal.signal(signal.SIGINT, signal.SIG_IGN) + signal.signal(signal.SIGTERM, signal.SIG_IGN) + self._regen.terminate() + received_signal.append(128 + signum) + + earlier_sigint_handler = signal.signal(signal.SIGINT, sighandler) + earlier_sigterm_handler = signal.signal(signal.SIGTERM, sighandler) + + try: + self._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) + self.returncode |= self._regen.returncode cp_missing = self._cp_missing |