summaryrefslogtreecommitdiffstats
path: root/bin/egencache
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 /bin/egencache
parente2a3237b4018e274350488868577c4d74a496b85 (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 'bin/egencache')
-rwxr-xr-xbin/egencache25
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