| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging as _logging |
| import signal as _signal |
| import threading as _threading |
| |
| _OK_HANDLERS = set(( |
| _signal.SIG_DFL, |
| _signal.SIG_IGN, |
| _signal.default_int_handler, |
| )) |
| |
| # Only manipulated on the main thread, so it doesn't need a lock. |
| _PREV_HANDLERS = {} |
| |
| _SET_SIGNALS_LOCK = _threading.Lock() |
| _SET_SIGNALS = set() |
| |
| |
| def _handler(signal_num, _): |
| with _SET_SIGNALS_LOCK: |
| _SET_SIGNALS.add(signal_num) |
| _signal.signal(signal_num, _PREV_HANDLERS[signal_num]) |
| _logging.warn( |
| '\n' |
| 'commit-queue will exit at the end of this processing loop.\n' |
| 'Hit Ctrl-C again to exit immediately.' |
| ) |
| |
| |
| def getTriggeredSignals(): |
| with _SET_SIGNALS_LOCK: |
| return _SET_SIGNALS.copy() |
| |
| |
| def installHandlers(*signal_numbers): |
| for signal_num in signal_numbers: |
| cur_handler = _signal.getsignal(signal_num) |
| if cur_handler == _handler: |
| continue |
| |
| assert cur_handler in _OK_HANDLERS, \ |
| 'A signal handler is already installed for signal %d' % signal_num |
| |
| _PREV_HANDLERS[signal_num] = cur_handler |
| _signal.signal(signal_num, _handler) |