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 |