diff options
author | Zac Medico <zmedico@gentoo.org> | 2012-12-28 23:18:47 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2012-12-28 23:30:07 -0800 |
commit | c7b3b1fbffb23f30c07fe57946221b62c54c1af9 (patch) | |
tree | 9b54bc760d126fe1b62dfc018274394d48573e9b | |
parent | 5e5a5cddfdeb3aa05932114fc1dce65b5be11ae9 (diff) | |
download | portage-c7b3b1fbffb23f30c07fe57946221b62c54c1af9.tar.gz portage-c7b3b1fbffb23f30c07fe57946221b62c54c1af9.tar.bz2 portage-c7b3b1fbffb23f30c07fe57946221b62c54c1af9.zip |
Add run_main_scheduler helper function.
-rw-r--r-- | pym/portage/util/_async/run_main_scheduler.py | 41 |
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 |