OLD | NEW |
| (Empty) |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import logging as _logging | |
6 import signal as _signal | |
7 import threading as _threading | |
8 | |
9 _OK_HANDLERS = set(( | |
10 _signal.SIG_DFL, | |
11 _signal.SIG_IGN, | |
12 _signal.default_int_handler, | |
13 )) | |
14 | |
15 # Only manipulated on the main thread, so it doesn't need a lock. | |
16 _PREV_HANDLERS = {} | |
17 | |
18 _SET_SIGNALS_LOCK = _threading.Lock() | |
19 _SET_SIGNALS = set() | |
20 | |
21 | |
22 def _handler(signal_num, _): | |
23 with _SET_SIGNALS_LOCK: | |
24 _SET_SIGNALS.add(signal_num) | |
25 _signal.signal(signal_num, _PREV_HANDLERS[signal_num]) | |
26 _logging.warn( | |
27 '\n' | |
28 'commit-queue will exit at the end of this processing loop.\n' | |
29 'Hit Ctrl-C again to exit immediately.' | |
30 ) | |
31 | |
32 | |
33 def getTriggeredSignals(): | |
34 with _SET_SIGNALS_LOCK: | |
35 return _SET_SIGNALS.copy() | |
36 | |
37 | |
38 def installHandlers(*signal_numbers): | |
39 for signal_num in signal_numbers: | |
40 cur_handler = _signal.getsignal(signal_num) | |
41 if cur_handler == _handler: | |
42 continue | |
43 | |
44 assert cur_handler in _OK_HANDLERS, \ | |
45 'A signal handler is already installed for signal %d' % signal_num | |
46 | |
47 _PREV_HANDLERS[signal_num] = cur_handler | |
48 _signal.signal(signal_num, _handler) | |
OLD | NEW |