summaryrefslogtreecommitdiffstats
path: root/pym/portage
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-12-28 23:18:47 -0800
committerZac Medico <zmedico@gentoo.org>2012-12-28 23:30:07 -0800
commitc7b3b1fbffb23f30c07fe57946221b62c54c1af9 (patch)
tree9b54bc760d126fe1b62dfc018274394d48573e9b /pym/portage
parent5e5a5cddfdeb3aa05932114fc1dce65b5be11ae9 (diff)
downloadportage-c7b3b1fbffb23f30c07fe57946221b62c54c1af9.tar.gz
portage-c7b3b1fbffb23f30c07fe57946221b62c54c1af9.tar.bz2
portage-c7b3b1fbffb23f30c07fe57946221b62c54c1af9.zip
Add run_main_scheduler helper function.
Diffstat (limited to 'pym/portage')
-rw-r--r--pym/portage/util/_async/run_main_scheduler.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/pym/portage/util/_async/run_main_scheduler.py b/pym/portage/util/_async/run_main_scheduler.py
new file mode 100644
index 000000000..10fed34b3
--- /dev/null
+++ b/pym/portage/util/_async/run_main_scheduler.py
@@ -0,0 +1,41 @@
+
+import signal
+
+def run_main_scheduler(scheduler):
+ """
+ Start and run an AsyncScheduler (or compatible object), and handle
+ SIGINT or SIGTERM by calling its terminate() method and waiting
+ for it to clean up after itself. If SIGINT or SIGTERM is received,
+ return signum, else return None. Any previous SIGINT or SIGTERM
+ signal handlers are automatically saved and restored before
+ returning.
+ """
+
+ received_signal = []
+
+ def sighandler(signum, frame):
+ signal.signal(signal.SIGINT, signal.SIG_IGN)
+ signal.signal(signal.SIGTERM, signal.SIG_IGN)
+ received_signal.append(signum)
+ scheduler.terminate()
+
+ earlier_sigint_handler = signal.signal(signal.SIGINT, sighandler)
+ earlier_sigterm_handler = signal.signal(signal.SIGTERM, sighandler)
+
+ try:
+ scheduler.start()
+ scheduler.wait()
+ 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:
+ return received_signal[0]
+ return None