Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/util/_async/
Date: Sat, 29 Dec 2012 07:46:05
Message-Id: 1356766207.c7b3b1fbffb23f30c07fe57946221b62c54c1af9.zmedico@gentoo
1 commit: c7b3b1fbffb23f30c07fe57946221b62c54c1af9
2 Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
3 AuthorDate: Sat Dec 29 07:18:47 2012 +0000
4 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
5 CommitDate: Sat Dec 29 07:30:07 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=c7b3b1fb
7
8 Add run_main_scheduler helper function.
9
10 ---
11 pym/portage/util/_async/run_main_scheduler.py | 41 +++++++++++++++++++++++++
12 1 files changed, 41 insertions(+), 0 deletions(-)
13
14 diff --git a/pym/portage/util/_async/run_main_scheduler.py b/pym/portage/util/_async/run_main_scheduler.py
15 new file mode 100644
16 index 0000000..10fed34
17 --- /dev/null
18 +++ b/pym/portage/util/_async/run_main_scheduler.py
19 @@ -0,0 +1,41 @@
20 +
21 +import signal
22 +
23 +def run_main_scheduler(scheduler):
24 + """
25 + Start and run an AsyncScheduler (or compatible object), and handle
26 + SIGINT or SIGTERM by calling its terminate() method and waiting
27 + for it to clean up after itself. If SIGINT or SIGTERM is received,
28 + return signum, else return None. Any previous SIGINT or SIGTERM
29 + signal handlers are automatically saved and restored before
30 + returning.
31 + """
32 +
33 + received_signal = []
34 +
35 + def sighandler(signum, frame):
36 + signal.signal(signal.SIGINT, signal.SIG_IGN)
37 + signal.signal(signal.SIGTERM, signal.SIG_IGN)
38 + received_signal.append(signum)
39 + scheduler.terminate()
40 +
41 + earlier_sigint_handler = signal.signal(signal.SIGINT, sighandler)
42 + earlier_sigterm_handler = signal.signal(signal.SIGTERM, sighandler)
43 +
44 + try:
45 + scheduler.start()
46 + scheduler.wait()
47 + finally:
48 + # Restore previous handlers
49 + if earlier_sigint_handler is not None:
50 + signal.signal(signal.SIGINT, earlier_sigint_handler)
51 + else:
52 + signal.signal(signal.SIGINT, signal.SIG_DFL)
53 + if earlier_sigterm_handler is not None:
54 + signal.signal(signal.SIGTERM, earlier_sigterm_handler)
55 + else:
56 + signal.signal(signal.SIGTERM, signal.SIG_DFL)
57 +
58 + if received_signal:
59 + return received_signal[0]
60 + return None